Could not find object method in ColdFusion...

Hi,

I have an instance of a ColdFusion object created and stored in session scope the first time during user's session start and persists over the lifespan of the session (See code below). The problem is that every time I introduce a new method to the component and deploy the method to Production, my users are receiving the error "Could not find method 'getProductInfo'..." This is because the users' session still persists and therefore all the methods and properties of the object are still referring to instance of object in the session that was created right before code deployment.

<cfparam name="session.myObject" default="#createObject('component','myComponents.Products').init(request.someVariable)#">
<cfset variables.result = session.myObject.getProductInfo(request.CustomerID)>

How do I prevent/resolve this problem?

NOTE: I could have used local variable to store the object, but I don't want to do that because doing so would require the object to be created on every page load. And I don't want to store the object in application variable neither as it presents other problems.

I'm using CF 8.

Many thanks in advance.
WebAppDeveloperAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

gdemariaCommented:
Typically, I do this in the application scope, which is much easier to rebuild on demand.   You just add a secret URL variable such as  &reloadAppVars=1 and that is tested in the application.cfc file and forces the reload.

In your case, you really can't do this as you have many session variables already loaded.  The user must logout and log back in.  Which basically means you have to do you loads to production at night and kick out all users when you do it forcing the session variables to refresh.   You can do that by changing the application name a little such as "myApp" to "MyApp1"  or restarting the CF service.
0
_agx_Commented:
Using the application scope is probably the best best.. but you said that's not an option.  

If you think it'll happen on a regular basis, you could add a time stamp flag to both the application and session scope. The stamp would indicate the date the components were last updated.

   OnApplicationStart
         application.ComponentsLastChanged = (date and time code last updated);

   OnSessionStart
        session.ComponentsLastChanged = now();

Then compare the dates in OnRequestStart. If the application timestamp is later than the one in the session scope, run some function to reinitialize the session objects

   OnRequestStart:
      <cfif dateCompare(application.ComponentsLastChanged, session.ComponentsLastChanged) gt 0>
               <cfset methodToReinitializeSessionComponents()>
       </cfif>
0
gdemariaCommented:
actually, you could just add a statement..

   <cfset structDelete(session, myObject)>

Leave that in there for 30 minutes and then remove it..

For the 30 minutes, you'll reload the object on every page load, but at least you're sure you'll have all your users reloaded.   Assuming that the session timeout is less than 30 minutes...
0
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

_agx_Commented:
Oops.. mid-air post collision.

I think my suggestion would work too. But if it's anything more than a single component, I'd probably go with gd's suggestion of a complete reset.  Starting with a clean slate is almost always less problematic. If only because it's easy forget dependencies and end up causing problems because you forget to reload X when you reloaded Y.
0
gdemariaCommented:
agx, I like the general idea, not sure I'm following the date stamps though.  The application and session scopes aren't firing in the situations when the error occurs.   They fire on a new user connection, that's not the problem, right?

So an existing user, who is already connected with a session loaded can't find the newly loaded cfc method.   So, I think the load date should compare against a hard coded, "cfc last uploaded date"

something like this perhaps...


onSessionStart
      session.ComponentsLastLoaded = now();


   OnRequestStart:
      <cfset request.componentsUpgradDate = "3/12/2012"> <!---- change this each time you upload a new CFC

      <cfif dateCompare(session.ComponentsLastLoaded, request.componentsUpgradDate) gt 0>
               <cfset methodToReinitializeSessionComponents()>
       </cfif>
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
_agx_Commented:
No, I think we're thinking the same thing.  I was assuming they'd automatically call onApplicationStart to reset the application (that's what I do with updates to make sure all changes propogate). In which case it doesn't matter whether you store the app time stamp in the application scope OR hard code it in OnRequestStart. Either way you have to change the Application.cfc file - but the net effect should be the same.

Either is fine, but you're right, hard coding the date in OnRequestStart is simpler.
0
WebAppDeveloperAuthor Commented:
gdemaria,

Should it be this way instead?

 <cfif dateCompare(request.componentsUpgradDate, session.ComponentsLastLoaded) gt 0>
         <cfset methodToReinitializeSessionComponents()>
 </cfif>

Meanting if request.componentsUpgradDate is later than session.ComponentsLastLoaded, then we re-init the session. Otherwise, the code will be reinitializing the session on every page load after user's session times out and begins a new session?
0
_agx_Commented:
Yes, I'm guessing gd just swapped the dates in my original example accidentally.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
ColdFusion Language

From novice to tech pro — start learning today.