pero 2005/03/25 14:18:38 Modified: modules/cluster/src/share/org/apache/catalina/cluster/tcp TcpReplicationThread.java Log: use constant ACK byte array instead create new 3 byte buffer for every message ack better waitAck Handling Revision Changes Path 1.14 +30 -22 jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp/TcpReplicationThread.java Index: TcpReplicationThread.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp/TcpReplicationThread.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- TcpReplicationThread.java 15 Feb 2005 09:31:45 -0000 1.13 +++ TcpReplicationThread.java 25 Mar 2005 22:18:38 -0000 1.14 @@ -15,26 +15,28 @@ */ package org.apache.catalina.cluster.tcp; +import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; -import java.io.IOException; import java.nio.channels.SocketChannel; + import org.apache.catalina.cluster.io.ObjectReader; /** - * A worker thread class which can drain channels and echo-back - * the input. Each instance is constructed with a reference to - * the owning thread pool object. When started, the thread loops - * forever waiting to be awakened to service the channel associated - * with a SelectionKey object. - * The worker is tasked by calling its serviceChannel() method - * with a SelectionKey object. The serviceChannel() method stores - * the key reference in the thread object then calls notify() - * to wake it up. When the channel has been drained, the worker - * thread returns itself to its parent pool. - */ -public class TcpReplicationThread extends WorkerThread -{ + * A worker thread class which can drain channels and echo-back the input. Each + * instance is constructed with a reference to the owning thread pool object. + * When started, the thread loops forever waiting to be awakened to service the + * channel associated with a SelectionKey object. The worker is tasked by + * calling its serviceChannel() method with a SelectionKey object. The + * serviceChannel() method stores the key reference in the thread object then + * calls notify() to wake it up. When the channel has been drained, the worker + * thread returns itself to its parent pool. + * + * @author Filip Hanik + * @version $Revision$, $Date$ + */ +public class TcpReplicationThread extends WorkerThread { + private static final byte[] ACK_COMMAND = new byte[] {6, 2, 3}; private static org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog( TcpReplicationThread.class ); private ByteBuffer buffer = ByteBuffer.allocate (1024); @@ -53,7 +55,8 @@ // sleep and release object lock this.wait(); } catch (InterruptedException e) { - log.info("TCP worker thread interrupted in cluster",e); + if(log.isInfoEnabled()) + log.info("TCP worker thread interrupted in cluster",e); // clear interrupt status Thread.interrupted(); } @@ -119,16 +122,16 @@ // loop while data available, channel is non-blocking while ((count = channel.read (buffer)) > 0) { buffer.flip(); // make buffer readable - int pkgcnt = reader.append(buffer.array(),0,count); + reader.append(buffer.array(),0,count); buffer.clear(); // make buffer empty } //check to see if any data is available int pkgcnt = reader.execute(); - while ( pkgcnt > 0 ) { - if (waitForAck) { + if (waitForAck) { + while ( pkgcnt > 0 ) { sendAck(key,channel); - } //end if - pkgcnt--; + pkgcnt--; + } } if (count < 0) { @@ -149,10 +152,15 @@ } + /** + * send a reply-acknowledgement (6,2,3) + * @param key + * @param channel + */ private void sendAck(SelectionKey key, SocketChannel channel) { - //send a reply-acknowledgement + try { - channel.write(ByteBuffer.wrap(new byte[] {6, 2, 3})); + channel.write(ByteBuffer.wrap(ACK_COMMAND)); } catch ( java.io.IOException x ) { log.warn("Unable to send ACK back through channel, channel disconnected?: "+x.getMessage()); }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]