User: jules_gosnell
  Date: 02/01/31 16:32:24

  Modified:    jetty/src/main/org/jboss/jetty/session
                        DistributedHttpSession.java
                        DistributedHttpSessionManager.java
  Log:
  some way further to configurable snapshot strategies and intervals,
  
  Revision  Changes    Path
  1.5       +37 -17    
contrib/jetty/src/main/org/jboss/jetty/session/DistributedHttpSession.java
  
  Index: DistributedHttpSession.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/contrib/jetty/src/main/org/jboss/jetty/session/DistributedHttpSession.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- DistributedHttpSession.java       2002/01/16 00:36:51     1.4
  +++ DistributedHttpSession.java       2002/02/01 00:32:24     1.5
  @@ -46,7 +46,6 @@
   
     final boolean                       _heldByValue             =true; // attributes 
are held in store by value, not reference
     final boolean                       _accessDirties           =true; // updating 
_lastAccessedTime dirties session
  -  final boolean                       _snapshotNeedsActivation =true; // they will 
not have been properly passivated
     final boolean                       _isDistributed           =true;
     volatile boolean                    _isNew                   =true; // risky !
     volatile boolean                    _isValid                 =true; // risky !
  @@ -96,7 +95,7 @@
   
       _attributes.putAll(data.getAttributes());
   
  -    boolean notify=data.getAttributesWerePassivated() || _snapshotNeedsActivation;
  +    boolean notify=data.getAttributesWerePassivated() || 
_manager.getSnapshotStrategy().getNotifyActivate();
   
       // send activate events to listening attributes
       if (notify && _attributes.size()>0)
  @@ -426,10 +425,12 @@
     {
       if (attribute instanceof HttpSessionActivationListener)
       {
  -      _log.warn("WARNING: About to activate a session attribute that was not 
passivated: "+attribute);
  -      _log.warn("WARNING: This was probably due to an uncontrolled server 
shutdown.");
  -      ((HttpSessionActivationListener)attribute)
  -     .sessionDidActivate(event);
  +      if (warn)
  +      {
  +     _log.warn("WARNING: About to activate a session attribute that was not 
passivated: "+attribute);
  +     _log.warn("WARNING: This was probably due to an uncontrolled server 
shutdown.");
  +      }
  +      ((HttpSessionActivationListener)attribute) .sessionDidActivate(event);
       }
     }
   
  @@ -443,20 +444,20 @@
   
     //----------------------------------------
   
  -  protected void
  -    snapshot()
  +  public void
  +    snapshot(boolean notifyActivate, boolean notifyPassivate)
     {
  -    store(false, false);
  +    store(notifyActivate, notifyPassivate, false);
     }
   
     protected void
       passivate()
     {
  -    store(true, true);
  +    store(false, true, true);
     }
   
     protected synchronized void
  -    store(boolean notifyAttributes, boolean shutdown)
  +    store(boolean notifyActivate, boolean notifyPassivate, boolean shutdown)
     {
       // if there are no changes and this is not the final passivation
       // during a controlled shutdown of webapp or webcontainer, we
  @@ -469,10 +470,10 @@
       {
         // whilst this method is synchronized, _attributes may still be
         // modified via their public access which only synchronise on
  -      // _attributes itself. In order to cause as little contention for
  -      // the _attributes map as possible I am going to try taking a copy
  -      // here - otherwise we will have to hang on to a ock on it for
  -      // ages.
  +      // _attributes itself. In order to cause as little contention
  +      // for the _attributes map as possible I am going to try taking
  +      // a copy here - otherwise we will have to hang on to a lock on
  +      // it for ages.
   
         // copy is a shallow, not deep, copy. If attributes within it
         // are being modified by another thread whilst being
  @@ -489,7 +490,8 @@
        }
         }
   
  -      if (notifyAttributes && copy!=null)
  +      // about to passivate...
  +      if (notifyPassivate && copy!=null)
         {
        // send passivate events to listening attributes...
        HttpSessionEvent event=new HttpSessionEvent(this);
  @@ -516,8 +518,26 @@
         // provided I slow down the collection of the stored state, it
         // will never be collected before me....
         data.setMaxInactiveInterval(getMaxInactiveInterval()+5);
  -      data.setAttributesWerePassivated(notifyAttributes);
  +      data.setAttributesWerePassivated(notifyPassivate);
         store.put(getId(), data);
  +
  +      // about to activate...
  +      if (notifyActivate && copy!=null)
  +      {
  +     // send activate events to listening attributes...
  +     HttpSessionEvent event=new HttpSessionEvent(this);
  +     Iterator i = copy.values().iterator();
  +
  +     try
  +     {
  +       while (i.hasNext())
  +         notifySessionDidActivate(i.next(), event, false);
  +     }
  +     catch (Exception e)
  +     {
  +       _log.error("Problem whilst activating session attributes", e);
  +     }
  +      }
       }
     }
   
  
  
  
  1.8       +185 -8    
contrib/jetty/src/main/org/jboss/jetty/session/DistributedHttpSessionManager.java
  
  Index: DistributedHttpSessionManager.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/contrib/jetty/src/main/org/jboss/jetty/session/DistributedHttpSessionManager.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- DistributedHttpSessionManager.java        2002/01/22 21:03:04     1.7
  +++ DistributedHttpSessionManager.java        2002/02/01 00:32:24     1.8
  @@ -5,7 +5,7 @@
    * See terms of license at gnu.org.
    */
   
  -// $Id: DistributedHttpSessionManager.java,v 1.7 2002/01/22 21:03:04 jules_gosnell 
Exp $
  +// $Id: DistributedHttpSessionManager.java,v 1.8 2002/02/01 00:32:24 jules_gosnell 
Exp $
   
   // TODO
   
  @@ -41,6 +41,123 @@
   
   //------------------------------------------------------------------------------
   
  +// for a snapshot strategy that stores 'every' change, we really need
  +// a different HttpSession implementation - e.g. that IS an EJB... -
  +// this implies that the DistributedStore instance needs some input in
  +// the selection of the class to instantiate for an HttpSession.
  +
  +abstract class
  +  SnapshotStrategy
  +{
  +  final boolean _notifyActivate;
  +  final boolean _notifyPassivate;
  +
  +  SnapshotStrategy()
  +  {
  +    _notifyActivate=false;
  +    _notifyPassivate=false;
  +  }
  +
  +  SnapshotStrategy(boolean notifyActivate, boolean notifyPassivate)
  +  {
  +    _notifyActivate=notifyActivate;
  +    _notifyPassivate=notifyPassivate;
  +  }
  +
  +  public void
  +    snapshot(DistributedHttpSession session)
  +  {
  +    session.snapshot(_notifyActivate, _notifyPassivate);
  +  }
  +
  +  public boolean
  +    getNotifyActivate()
  +  {
  +    return _notifyActivate;
  +  }
  +
  +  public boolean
  +    getNotifyPassivate()
  +  {
  +    return _notifyPassivate;
  +  }
  +}
  +
  +class DummySnapshotStrategy
  +  extends SnapshotStrategy
  +{
  +  public void snapshot(DistributedHttpSession session)
  +  {}
  +}
  +
  +class RequestSnapshotStrategy
  +  extends SnapshotStrategy
  +{
  +  RequestSnapshotStrategy(boolean notifyActivate, boolean notifyPassivate)
  +  {
  +    super(notifyActivate, notifyPassivate);
  +  }
  +
  +  public void snapshot(DistributedHttpSession session)
  +  {}
  +}
  +
  +class IntervalSnapshotStrategy
  +  extends SnapshotStrategy
  +{
  +  class TimeOutNotifier
  +    implements AbstractTimeOutManager.TimeOutNotifier
  +  {
  +    public void
  +      timeOut(Object object)
  +    {
  +      DistributedHttpSession session=(DistributedHttpSession)object;
  +      System.out.println("snapshotting session ("+session.getId()+")");
  +      snapshot(session);
  +      //      _manager.reregister(session, System.currentTimeMillis(), 
_interval*1000);
  +    }
  +  }
  +
  +  class TimeOutTester
  +    implements AbstractTimeOutManager.TimeOutTester
  +  {
  +    public long
  +      timeRemaining(Object object, long now, long maxInactiveInterval)
  +    {
  +      DistributedHttpSession session=(DistributedHttpSession)object;
  +      return session.getLastAccessedTime()+ maxInactiveInterval- now;
  +    }
  +  }
  +
  +  //  final AbstractTimeOutManager _manager;
  +  final int                    _interval;
  +
  +  IntervalSnapshotStrategy(/* AbstractTimeOutManager manager,*/
  +                        int interval, boolean notifyActivate, boolean 
notifyPassivate)
  +  {
  +    super(notifyActivate, notifyPassivate);
  +    //    _manager=manager;
  +    _interval=interval;
  +  }
  +
  +  public void snapshot(DistributedHttpSession session)
  +  {}
  +}
  +
  +class IdleSnapshotStrategy
  +  extends SnapshotStrategy
  +{
  +  IdleSnapshotStrategy(boolean notifyActivate, boolean notifyPassivate)
  +  {
  +    super(notifyActivate, notifyPassivate);
  +  }
  +
  +  public void snapshot(DistributedHttpSession session)
  +  {}
  +}
  +
  +//------------------------------------------------------------------------------
  +
   class MyTimeOutNotifier
     implements AbstractTimeOutManager.TimeOutNotifier
   {
  @@ -67,7 +184,7 @@
   //------------------------------------------------------------------------------
   /**
    *
  - * @version $Id: DistributedHttpSessionManager.java,v 1.7 2002/01/22 21:03:04 
jules_gosnell Exp $
  + * @version $Id: DistributedHttpSessionManager.java,v 1.8 2002/02/01 00:32:24 
jules_gosnell Exp $
    * @author [EMAIL PROTECTED]
    */
   //----------------------------------------
  @@ -79,6 +196,7 @@
     static { _scavenger.start(); }
   
     final AbstractStore              _store;
  +  final SnapshotStrategy           _snapshotStrategy;
     final Logger                     _log;
     final JBossWebApplicationContext _context;
     final ServletHandler             _handler;
  @@ -90,6 +208,7 @@
     volatile boolean                 _isStarted                 =false; // TODO
     volatile int                     _dftMaxIdleSecs            =0; // <=0 means 
never timeout...
   
  +
     //----------------------------------------
   
     static AbstractStore
  @@ -102,19 +221,71 @@
       }
       catch (Exception e)
       {
  -      Logger.getLogger("DistributedHttpSessionManager").
  -     error("problem initialising distributed store", e);
  +      Logger.getLogger("DistributedHttpSessionManager").error("problem initialising 
distributed store", e);
         return null;
       }
     }
   
     public
  -    DistributedHttpSessionManager(JBossWebApplicationContext context, String store)
  +    DistributedHttpSessionManager(JBossWebApplicationContext context,
  +                               String storageStrategy,
  +                               String snapshotFrequency,
  +                               String snapshotNotificationPolicy)
     {
       _context=context;
       _handler=_context.getServletHandler();
       _log    =Logger.getLogger(getClass().getName()+"#" +_context.getContextPath());
  -    _store  =instantiateStore(store);
  +    _store  =instantiateStore(storageStrategy);
  +
  +    SnapshotStrategy tmp=null;
  +
  +    boolean notifyActivation=false;
  +    boolean notifyPassivation=false;
  +    if (snapshotNotificationPolicy.equalsIgnoreCase("both"))
  +    {
  +      notifyActivation=true;
  +      notifyPassivation=true;
  +    }
  +    else if (snapshotNotificationPolicy.equalsIgnoreCase("neither"))
  +    {
  +      notifyActivation=true;
  +      notifyPassivation=true;
  +    }
  +    else if (snapshotNotificationPolicy.equalsIgnoreCase("activate"))
  +    {
  +      notifyActivation=true;
  +      notifyPassivation=false;
  +    }
  +    else if (snapshotNotificationPolicy.equalsIgnoreCase("passivate"))
  +    {
  +      notifyActivation=false;
  +      notifyPassivation=true;
  +    }
  +    else
  +    {
  +      _log.warn("bad HttpSessionSnapshotNotificationPolicy: 
"+snapshotNotificationPolicy+" - should be both/neither/passivate/activate");
  +    }
  +
  +    if (snapshotFrequency.equalsIgnoreCase("never"))
  +      tmp=new DummySnapshotStrategy();
  +    else if (snapshotFrequency.equalsIgnoreCase("idle"))
  +      tmp=new IdleSnapshotStrategy(notifyActivation, notifyPassivation);
  +    else if (snapshotFrequency.equalsIgnoreCase("request"))
  +      tmp=new RequestSnapshotStrategy(notifyActivation, notifyPassivation);
  +    else
  +    {
  +      try
  +      {
  +     tmp=new IntervalSnapshotStrategy(Integer.decode(snapshotFrequency).intValue(),
  +                                      notifyActivation, notifyPassivation);
  +      }
  +      catch (NumberFormatException e)
  +      {
  +     _log.warn("bad HttpSessionSnapshotFrequency: "+snapshotFrequency+" - should be 
never/idle/request/<#minutes>");
  +     tmp=new DummySnapshotStrategy();
  +      }
  +    }
  +    _snapshotStrategy=tmp;
     }
   
     //----------------------------------------
  @@ -176,7 +347,7 @@
       if (session==null && _isDistributed && _store.isValid())
       {
         AbstractHttpSessionData data=_store.get(id, !_maintainDistributedState);
  -     if (data!=null)
  +      if (data!=null)
         {
        session=new DistributedHttpSession(this, id, data);
        putSession(id,session);
  @@ -273,6 +444,12 @@
       return _store;
     }
   
  +  SnapshotStrategy
  +    getSnapshotStrategy()                    // TODO
  +  {
  +    return _snapshotStrategy;
  +  }
  +
     ServletHandler
       getHandler()             // TODO
     {
  @@ -354,7 +531,7 @@
       notifyAttributeRemoved(HttpSession session, String key, Object value)
     {
       int n=_sessionAttributeListeners.size();
  -   if (n>0)
  +    if (n>0)
       {
         HttpSessionBindingEvent event =
        new HttpSessionBindingEvent(session, key, value);
  
  
  

_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to