fhanik 2003/10/14 15:40:34 Modified: modules/cluster/src/share/org/apache/catalina/cluster/session SimpleTcpReplicationManager.java modules/cluster/src/share/org/apache/catalina/cluster/tcp SimpleTcpCluster.java Log: Implemented session state transfer, I can see that the ContextConfig class has solved my problem about the distributable element being parsed after the manager is created. Good job! Revision Changes Path 1.13 +48 -15 jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/session/SimpleTcpReplicationManager.java Index: SimpleTcpReplicationManager.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/session/SimpleTcpReplicationManager.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- SimpleTcpReplicationManager.java 14 Oct 2003 21:58:52 -0000 1.12 +++ SimpleTcpReplicationManager.java 14 Oct 2003 22:40:34 -0000 1.13 @@ -147,6 +147,13 @@ protected org.apache.catalina.cluster.tcp.SimpleTcpCluster cluster; protected java.util.HashMap invalidatedSessions = new java.util.HashMap(); + + /** + * Flag to keep track if the state has been transferred or not + * Assumes false. + */ + protected boolean stateTransferred = false; + /** * Constructor, just calls super() * @@ -341,7 +348,6 @@ long interval = session.getMaxInactiveInterval(); long lastaccdist = System.currentTimeMillis() - session.getLastAccessWasDistributed(); - System.out.println("\nFH\ninterval="+interval+" lastaccdist="+lastaccdist); if ( ((interval*1000) / lastaccdist)< 3 ) { SessionMessage accmsg = new SessionMessage(name, SessionMessage.EVT_SESSION_ACCESSED, @@ -474,13 +480,35 @@ log("Starting... no cluster associated with this context:"+getName(),1); return; } + if (cluster.getMembers().length > 0) { + Member mbr = cluster.getMembers()[0]; SessionMessage msg = new SessionMessage(this.getName(), SessionMessage.EVT_GET_ALL_SESSIONS, null, null); - cluster.send(msg, cluster.getMembers()[0]); + cluster.send(msg, mbr); + log.warn("Manager["+getName()+"], requesting session state from "+mbr+ + ". This operation will timeout if no session state has been received within "+ + "60 seconds"); + long reqStart = System.currentTimeMillis(); + long reqNow = 0; + boolean isTimeout=false; + do { + try { + Thread.currentThread().sleep(100); + }catch ( Exception sleep) {} + reqNow = System.currentTimeMillis(); + isTimeout=((reqNow-reqStart)>(1000*60)); + } while ( (!isStateTransferred()) && (!isTimeout)); + if ( isTimeout ) { + log.error("Manager["+getName()+"], No session state received, timing out."); + }else { + log.info("Manager["+getName()+"], session state received in "+(reqNow-reqStart)+" ms."); + } + } else { + log.info("Manager["+getName()+"], skipping state transfer. No members active in cluster group."); }//end if mChannelStarted = true; } catch ( Exception x ) { @@ -555,13 +583,13 @@ oout.writeObject(data); }//for //don't send a message if we don't have to - if ( sessions.length > 0) { - byte[] data = bout.toByteArray(); - SessionMessage newmsg = new SessionMessage(name, - SessionMessage.EVT_ALL_SESSION_DATA, - data, ""); - cluster.send(newmsg, sender); - }//end if + oout.flush(); + oout.close(); + byte[] data = bout.toByteArray(); + SessionMessage newmsg = new SessionMessage(name, + SessionMessage.EVT_ALL_SESSION_DATA, + data, ""); + cluster.send(newmsg, sender); break; } case SessionMessage.EVT_ALL_SESSION_DATA: { @@ -576,6 +604,7 @@ session.setManager(this); add(session); }//for + stateTransferred=true; break; } case SessionMessage.EVT_SESSION_CREATED: { @@ -622,6 +651,10 @@ log("InMemoryReplicationManager.messageDataReceived()", ex); }//catch } + + public boolean isStateTransferred() { + return stateTransferred; + } public void log(String msg) { log(msg,3); @@ -632,7 +665,7 @@ } public void log(String msg, int level) { if ( getDebug() >= level ) { - String lmsg = "[InMemoryReplicationManager] "+msg; + String lmsg = msg; if ( mPrintToScreen ) System.out.println(lmsg); SimpleTcpCluster.log.info(lmsg); } @@ -640,12 +673,12 @@ public void log(String msg, Throwable x, int level) { if ( getDebug() >= level ) { - String lmsg = "[InMemoryReplicationManager] "+msg; + String lmsg = msg; if ( mPrintToScreen ) { System.out.println(lmsg); x.printStackTrace(); } - SimpleTcpCluster.log.info(lmsg,x); + SimpleTcpCluster.log.error(lmsg,x); }//end if } } 1.16 +4 -5 jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp/SimpleTcpCluster.java Index: SimpleTcpCluster.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp/SimpleTcpCluster.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- SimpleTcpCluster.java 9 Sep 2003 15:27:16 -0000 1.15 +++ SimpleTcpCluster.java 14 Oct 2003 22:40:34 -0000 1.16 @@ -473,7 +473,6 @@ */ public void start() throws LifecycleException { - if (started) throw new LifecycleException (sm.getString("cluster.alreadyStarted"));
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]