Forwarded to the ML

On Mon, Feb 22, 2010 at 1:56 PM, Emmanuel Lécharny<[email protected]>  wrote:
 On 2/22/10 8:56 AM, Ashish wrote:

 On Mon, Feb 22, 2010 at 1:12 PM, Emmanuel Lecharny<[email protected]>
   wrote:


 Some thoughts about how to manage Idle sessions :

 In order to manage idle sessions, we should use a separated thread which
 will check periodically that the session has been used or not. We use a
 boolean flag which is reset when we read of write on this session, and
 switch to true when we check the session idleness : if the flag is
 already
 true, that means the session has been idle for at least one period.




 The thread will be wake up after having slept for the defined period
 (configurable globally), and will check every registered sessions.


 I did something similar for a cache. Used an ScheduledExecutor to
 iterate through entries and decide what to do.
 It was ok, the only problem in my case was that I got CPU spikes each
 time I iterated, but the num of entries were more than a million :-)


 It's the difference between a system that check everynow and then (like the
 one we have), or a differed system. Of course, if you have to check millions
 of elements, that's costly.



 The flag is named isIdle. It's an AtomicBoolean.

 Note : if we want to manage different idle times for different sessions
 we
 need to compute the sleep period for all the followed sessions, and also
 add
 a map of sessions to check accordingly to the periods. IMO, it's a bit
 over
 killing atm.


 Ehcache has something similar for cache entries. Each cache entry has
 last accessed timestamp and based on that calculation is made.
 So if Session doesn't fit the criteria, we can safely leave the same.
 Side effect would be that we may not have precise time for events, it
 shall be when our Thread iterates through all of them. the other
 alternative is to use Timertask, but it has overhead that we need to
 kill the task each time the session is accessed and created a new
 task. there is a lot of overhead in this approach, but it works fine.


 What I want to avoid is a System.currentTimeMillis() call for every byte
 read or written on each session, and stored in the session, and also avoid
 the main thread to get swamped by the idleness detection everytime we have
 some data coming in or getting out.



hmm... don't know of any other way as of now :(

Any thoughts on how can we do it ?



 Q: should we manage two different IDLE states ? One for READ nod one for
 WRITE ? Not sure it makes sense...


 Not sure if it makes sense, but whatever the case may be.. we fire a
 session idle event, and either use a keep-alive functionality or kill
 the session.
 May be we can start with one event. Could any implementation be
 interested in having distinct event? I am not sure


 me neither... Let's start with one event, then we can improve it once it's
 solid.

 --
 Regards,
 Cordialement,
 Emmanuel Lécharny
 www.nextury.com






--
thanks
ashish

Blog: http://www.ashishpaliwal.com/blog
My Photo Galleries: http://www.pbase.com/ashishpaliwal


Reply via email to