Solved

Could not find object method in ColdFusion...

Posted on 2012-03-29
8
289 Views
Last Modified: 2012-03-29
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.
0
Comment
Question by:WebAppDeveloper
  • 4
  • 3
8 Comments
 
LVL 39

Expert Comment

by:gdemaria
ID: 37783849
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
 
LVL 52

Assisted Solution

by:_agx_
_agx_ earned 300 total points
ID: 37783900
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
 
LVL 39

Assisted Solution

by:gdemaria
gdemaria earned 200 total points
ID: 37783911
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
 
LVL 52

Expert Comment

by:_agx_
ID: 37783948
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
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 
LVL 39

Accepted Solution

by:
gdemaria earned 200 total points
ID: 37783953
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
 
LVL 52

Assisted Solution

by:_agx_
_agx_ earned 300 total points
ID: 37783991
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
 

Author Comment

by:WebAppDeveloper
ID: 37784385
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
 
LVL 52

Assisted Solution

by:_agx_
_agx_ earned 300 total points
ID: 37784448
Yes, I'm guessing gd just swapped the dates in my original example accidentally.
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

This article  is about submitting  form through  ColdFusion.Ajax.submitForm to the action page and send a response back in JSON format which later can be decoded using ColdFusion.JSON.decode. By this way you can avoid the usual page refresh for subm…
The technique is by far very Simple! How we can export the ColdFusion query results to DOC file?  Well before writing this I researched a lot in Internet but did not found a good Answer anyways!  So i thought now i should share my small snippet w…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…
This video explains how to create simple products associated to Magento configurable product and offers fast way of their generation with Store Manager for Magento tool.

757 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now