Author: fhanik Date: Tue May 2 14:15:22 2006 New Revision: 399050 URL: http://svn.apache.org/viewcvs?rev=399050&view=rev Log: Implemented a channel interceptor heartbeat, useful for cleaning up
Modified: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/GroupChannel.java tomcat/container/tc5.5.x/modules/groupcom/to-do.txt Modified: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/GroupChannel.java URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/GroupChannel.java?rev=399050&r1=399049&r2=399050&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/GroupChannel.java (original) +++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/GroupChannel.java Tue May 2 14:15:22 2006 @@ -21,6 +21,7 @@ import java.util.Iterator; import org.apache.catalina.tribes.ByteMessage; +import org.apache.catalina.tribes.Channel; import org.apache.catalina.tribes.ChannelException; import org.apache.catalina.tribes.ChannelInterceptor; import org.apache.catalina.tribes.ChannelListener; @@ -32,15 +33,9 @@ import org.apache.catalina.tribes.Member; import org.apache.catalina.tribes.MembershipListener; import org.apache.catalina.tribes.MembershipService; +import org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor; import org.apache.catalina.tribes.io.ClusterData; import org.apache.catalina.tribes.io.XByteBuffer; -import java.io.ObjectInput; -import java.io.Externalizable; - -import java.io.IOException; -import java.io.ObjectOutput; -import org.apache.catalina.tribes.Channel; -import org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor; /** * The GroupChannel manages the replication channel. It coordinates @@ -51,7 +46,9 @@ * @version $Revision: 304032 $, $Date: 2005-07-27 10:11:55 -0500 (Wed, 27 Jul 2005) $ */ public class GroupChannel extends ChannelInterceptorBase implements ManagedChannel { - + protected boolean heartbeatEnabled = true; + protected long heartbeatSleeptime = 60*1000;//only run once a minute + protected HeartbeatThread hbthread = null; private ChannelCoordinator coordinator = new ChannelCoordinator(); private ChannelInterceptor interceptors = null; @@ -240,10 +237,23 @@ } - public void start(int svc) throws ChannelException { + public synchronized void start(int svc) throws ChannelException { setupDefaultStack(); if (optionCheck) checkOptionFlags(); super.start(svc); + if ( hbthread == null && heartbeatEnabled ) { + hbthread = new HeartbeatThread(this,heartbeatSleeptime); + hbthread.start(); + } + } + + public synchronized void stop(int svc) throws ChannelException { + if (hbthread != null) { + hbthread.stopHeartbeat(); + hbthread.interrupt(); + hbthread = null; + } + super.stop(svc); } public ChannelInterceptor getFirstInterceptor() { @@ -297,6 +307,29 @@ return new InterceptorIterator(this.getNext(),this.coordinator); } + public void setOptionCheck(boolean optionCheck) { + this.optionCheck = optionCheck; + } + + public void setHeartbeatEnabled(boolean heartbeatEnabled) { + this.heartbeatEnabled = heartbeatEnabled; + } + + public void setHeartbeatSleeptime(long heartbeatSleeptime) { + this.heartbeatSleeptime = heartbeatSleeptime; + } + + public boolean getOptionCheck() { + return optionCheck; + } + + public boolean getHeartbeatEnabled() { + return heartbeatEnabled; + } + + public long getHeartbeatSleeptime() { + return heartbeatSleeptime; + } public static class InterceptorIterator implements Iterator { private ChannelInterceptor end; @@ -324,14 +357,40 @@ } } - public void setOptionCheck(boolean optionCheck) { - this.optionCheck = optionCheck; - } - - public boolean getOptionCheck() { - return optionCheck; - } - + public static class HeartbeatThread extends Thread { + protected static org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(HeartbeatThread.class); + protected static int counter = 1; + protected static synchronized int inc() { + return counter++; + } + + protected boolean doRun = true; + protected GroupChannel channel; + protected long sleepTime; + public HeartbeatThread(GroupChannel channel, long sleepTime) { + super(); + setName("GroupChannel-Heartbeat-"+inc()); + setDaemon(true); + this.channel = channel; + this.sleepTime = sleepTime; + } + public void stopHeartbeat() { + doRun = false; + } + + public void run() { + while (doRun) { + try { + Thread.sleep(sleepTime); + channel.heartbeat(); + } catch ( InterruptedException x ) { + interrupted(); + } catch ( Exception x ) { + log.error("Unable to send heartbeat through Tribes interceptor stack.",x); + }//catch + }//while + }//run + }//HeartbeatThread Modified: tomcat/container/tc5.5.x/modules/groupcom/to-do.txt URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/to-do.txt?rev=399050&r1=399049&r2=399050&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/to-do.txt (original) +++ tomcat/container/tc5.5.x/modules/groupcom/to-do.txt Tue May 2 14:15:22 2006 @@ -36,6 +36,8 @@ =========================================== a) Somehow the first NIO connection made, always closes down, why + b) pull the network cord and watch the membership layer freak out + Code Tasks: =========================================== 43. Silent member, node discovery. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]