You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by pe...@apache.org on 2005/03/25 23:18:38 UTC
cvs commit: jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp TcpReplicationThread.java
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: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org