12 Replies Latest reply on Jan 9, 2013 2:00 PM by Simon.Dau

    session counter vs cfschedule

    Simon.Dau Level 1

      Hi all,

       

      Got a bit of a riddle here. Trying to count current active number of sessions and as per ColdFusion documentation that should be done as follows:

       

      onSessionStart:

       

      <cfset Application.sessions = Application.sessions + 1>

       

       

      onSessionEnd:

       

      <cfset Arguments.ApplicationScope.sessions = Arguments.ApplicationScope.sessions - 1>

       

       

      That all works as expected as long as one doesn't use cfschedule events. Now in my application cfschedule runs every minute as a result creating  new sessions as it goes. What I'm trying to do is detect cfschedule event as a session 'runner' and ignore it for my session totals.

       

      On session start, that is done as follows:

       

      <cfif FindNoCase("CFSCHEDULE",CGI.HTTP_USER_AGENT) EQ 0>

           <cfset Application.sessions = Application.sessions + 1>

       

      </cfif>
      This way cfschedule is not counted as a site user, hence not logged.

      Now my question to the community is:
      How do you detect cfschedule event on session end? I was unable to locate any documentation explaining what sort of information is being passed inside the sessionScope to onSessionEnd function, hence how to access CGI info (if it's possible at all).

       

       

      Absolutely any input on this would be highly appreciated!

       

      Regards,

      Simon

        • 1. Re: session counter vs cfschedule
          BKBK Adobe Community Professional & MVP

          Since your code excludes cfschedule in onSessionStart, you need not make any allowance for it in onSessionEnd. The code,

           

          <cfset Arguments.ApplicationScope.sessions = Arguments.ApplicationScope.sessions - 1>

           

          should therefore be sufficient in onSessionEnd.

          • 2. Re: session counter vs cfschedule
            Simon.Dau Level 1

            Thanks BKBK, however the problem with your suggestion is that if onSessionStart number of sessions is 0 and cfschedule is skipped, onSessionEnd event if the same test to detect the cfscheduled event is not performed the total of session will go to -1.

             

            I actually solved the problem (or at least I think I did) earlier today. In the onSessionStart function save CGI.HTTP_USER_AGENT bit as a session variable, hence:

             

            session.cgitracking = CGI.HTTP_USER_AGENT;

             

            This variable will then become accessible inside onSessionEnd function  via arguments.sessionScope.

            At this point I am just performing the same check as in the onSessionStart function and skip session totals amendment should cfschedule gets detected.

             

            <cfif FindNoCase("CFSCHEDULE",arguments.sessionScope.cgitracking) EQ 0>

                 <cfset Application.sessions = Application.sessions - 1>

             

            </cfif>

             

            Hope this helps to someone facing same/similar issue(s) in the future.

             

            Regards,

            Simon

            • 3. Re: session counter vs cfschedule
              BKBK Adobe Community Professional & MVP

              What you have just done may work, but it is unnecessary. Think about it. There is no need to remove something you have already excluded.

               

              However, what you say made me think of a slight improvement to the code. This improves the overall design, whether or not cfschedule is taken into consideration.

               

              <cfif  Arguments.ApplicationScope.sessions GT 0>

              <cfset Arguments.ApplicationScope.sessions = Arguments.ApplicationScope.sessions - 1>

              </cfif >

              • 4. Re: session counter vs cfschedule
                tinu8805

                FWIW: Just wondering: WHAT kind of sessions to you start by the scheduler? Unattended ones? If so, they for sure will come to an end without timing out the session etc. If this is the case the end is foreseeable I think. This finalization code could then just decrease the session counter ..

                • 5. Re: session counter vs cfschedule
                  BKBK Adobe Community Professional & MVP

                  Unattended sessions coming to an end without timing out the session? What are you on about?

                  • 6. Re: session counter vs cfschedule
                    tinu8805 Level 1

                    i assume there is (unattended) work to do in a session created by the scheduler. this work will come to an end somehow. then, the session could be deliberately ended or at least counted as terminated.

                    • 7. Re: session counter vs cfschedule
                      Simon.Dau Level 1

                      Hi guys,

                       

                      cfchedule event starts a new session itself. As well as that it seems it's a session just like the one user would start loading the site. Therefore, as any other session it runs the session counter (Application.sessions) and increases it.

                       

                      I have managed to successfully detect it upon start with the code provided in my initial post.

                       

                      To answer to BKBK, if on session end, which was started by cfschedule event I would not run the same test to check whether the session in fact was initiated by the cfscheduler, the counter would be reduced.

                       

                      Your suggestion does not help to solve the issue as counter meant to display only the sessions started by visitors, hence genuine data on the current site activity. An example to explain it in detail:

                       

                      At a sample given time I have 5 users online. Then cfscheduler runs and creates extra session. I detect it and skip counter logging. At this moment I still have 5 users. Now let's assume the same users are browsing the website and sessions are extended beyond the original 30 minute timeout of inactivity. After 30 minutes cfscheduler's session will expire and run through the onSessionEnd function. If I would not detect it as such, the counter would be reduced to 4, even though 5 users are currently online. There's the problem I'm trying to solve.

                       

                      The solution I have posted is still not 100% confirmed as sometimes it indeed shows some weird statistics.

                       

                      Simon

                      • 8. Re: session counter vs cfschedule
                        BKBK Adobe Community Professional & MVP

                        I see. Then a possible solution consistent with your description is:

                         

                        <cflock name="appLock" timeout="3" type="exclusive">

                        <cfif FindNoCase("CFSCHEDULE",arguments.sessionScope.cgitracking) EQ 0 and arguments.ApplicationScope.session GT 0>

                             <cfset arguments.ApplicationScope.session = arguments.ApplicationScope.session - 1>

                        </cfif>

                        </cflock>

                         

                        That should possibly cure it of the weird occurrences.

                        • 9. Re: session counter vs cfschedule
                          BKBK Adobe Community Professional & MVP

                          Still assuming I understand it, then the following version is more efficient. It avoids repetition.

                           

                          In onSessionStart:

                           

                          <cfset session.isUserSession = NOT findNoCase("CFSCHEDULE",CGI.HTTP_USER_AGENT)>

                          <cfif session.isUserSession>

                               <cfset Application.sessions = Application.sessions + 1>

                          </cfif>

                           

                          In onSessionEnd:

                           

                          <cfif arguments.sessionScope.isUserSession and arguments.ApplicationScope.session GT 0>

                          <cflock name="appLock" timeout="3" type="exclusive">

                               <cfset arguments.ApplicationScope.session = arguments.ApplicationScope.session - 1>

                          </cflock>

                          </cfif>

                          • 10. Re: session counter vs cfschedule
                            Simon.Dau Level 1

                            Thanks for that! I've updated the code and was testing it over the past weeks. It still seems though, that at times it fails as current users online counter at times grows to ridiculous numbers, even though the built in visits log is showing 'slightly' more moderate numbers.

                            • 11. Re: session counter vs cfschedule
                              BKBK Adobe Community Professional & MVP

                              I think you have to restart ColdFusion or, at least, change the application's name in Application.cfc, so as to reset the number of sessions to zero.

                              • 12. Re: session counter vs cfschedule
                                Simon.Dau Level 1

                                @BKBK Done that numerous times. Well, used application reset function, if to be precise. It's kinda strange behaviour as it stays within normal limits for a while (meaning counter does go up and down) and then goes up quite significantly. Will do some more testing and post it here should something new come up.

                                 

                                Simon