You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by fh...@apache.org on 2006/02/23 20:55:25 UTC
svn commit: r380209 [5/12] - in /tomcat/container/tc5.5.x/modules: groupcom/
groupcom/etc/ groupcom/src/ groupcom/src/share/ groupcom/src/share/org/
groupcom/src/share/org/apache/ groupcom/src/share/org/apache/catalina/
groupcom/src/share/org/apache/ca...
Added: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/tcp/mbeans-descriptors.xml
URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/tcp/mbeans-descriptors.xml?rev=380209&view=auto
==============================================================================
--- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/tcp/mbeans-descriptors.xml (added)
+++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/tcp/mbeans-descriptors.xml Thu Feb 23 11:55:14 2006
@@ -0,0 +1,1046 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mbeans-descriptors PUBLIC
+ "-//Apache Software Foundation//DTD Model MBeans Configuration File"
+ "http://jakarta.apache.org/commons/dtds/mbeans-descriptors.dtd">
+<mbeans-descriptors>
+
+ <mbean name="SimpleTcpCluster"
+ description="Tcp Cluster implementation"
+ domain="Catalina"
+ group="Cluster"
+ type="org.apache.catalina.cluster.tcp.SimpleTcpCluster">
+ <attribute name="info"
+ description="Class version info"
+ type="java.lang.String"
+ writeable="false"/>
+ <attribute name="notifyLifecycleListenerOnFailure"
+ description="notify lifecycleListener from message transfer failure"
+ is="true"
+ type="boolean"/>
+ <attribute name="clusterName"
+ description="name of cluster"
+ type="java.lang.String"/>
+ <attribute name="managerClassName"
+ description="session mananager classname"
+ type="java.lang.String"/>
+ <attribute name="clusterLogName"
+ description="Name of cluster transfer log device"
+ type="java.lang.String"/>
+ <attribute name="doClusterLog"
+ is="true"
+ description="enable cluster log transfer logging"
+ type="boolean"/>
+ <operation name="setProperty"
+ description="set a property to all cluster managers (with prefix 'manager.')"
+ impact="ACTION"
+ returnType="void">
+ <parameter name="key"
+ description="Property name"
+ type="java.lang.String"/>
+ <parameter name="value"
+ description="Property value"
+ type="java.lang.String"/>
+ </operation>
+
+ <operation name="send"
+ description="send message to all cluster members"
+ impact="ACTION"
+ returnType="void">
+ <parameter name="message"
+ description="replication message"
+ type="org.apache.catalina.cluster.ClusterMessage"/>
+ </operation>
+
+ <operation name="sendClusterDomain"
+ description="send message to all cluster members with same domain"
+ impact="ACTION"
+ returnType="void">
+ <parameter name="message"
+ description="replication message"
+ type="org.apache.catalina.cluster.ClusterMessage"/>
+ </operation>
+
+ <operation name="sendToMember"
+ description="send message to one cluster member"
+ impact="ACTION"
+ returnType="void">
+ <parameter name="message"
+ description="replication message"
+ type="org.apache.catalina..cluster.ClusterMessage"/>
+ <parameter name="member"
+ description="cluster member"
+ type="java.lang.String"/>
+ </operation>
+
+ <operation name="start"
+ description="Start the cluster"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+
+ <operation name="stop"
+ description="Stop the cluster"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+
+ </mbean>
+
+ <mbean name="ClusterReceiverBase"
+ description="Tcp Cluster ReplicationListener implementation"
+ domain="Catalina"
+ group="Cluster"
+ type="org.apache.catalina.cluster.tcp.ClusterReceiverBase">
+ <attribute name="info"
+ description="Class version info"
+ type="java.lang.String"
+ writeable="false"/>
+ <attribute name="tcpListenAddress"
+ description="tcp listener address"
+ type="java.lang.String"/>
+ <attribute name="tcpListenPort"
+ description="tcp listener port"
+ type="int"/>
+ <attribute name="tcpThreadCount"
+ description="number of tcp listener worker threads"
+ type="int"/>
+ <attribute name="tcpSelectorTimeout"
+ description="tcp listener Selector timeout"
+ type="long"/>
+ <attribute name="nrOfMsgsReceived"
+ description="number of messages received from other nodes"
+ type="long"
+ writeable="false"/>
+ <attribute name="receivedTime"
+ description="total time message send time"
+ type="long"
+ writeable="false"/>
+ <attribute name="receivedProcessingTime"
+ description="received processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="minReceivedProcessingTime"
+ description="minimal received processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="avgReceivedProcessingTime"
+ description="received processing time / nrOfRequests"
+ type="double"
+ writeable="false"/>
+ <attribute name="maxReceivedProcessingTime"
+ description="maximal received processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="doReceivedProcessingStats"
+ description="create received processing time stats"
+ is="true"
+ type="boolean" />
+ <attribute name="avgTotalReceivedBytes"
+ description="received totalReceivedBytes / nrOfMsgsReceived"
+ type="long"
+ writeable="false"/>
+ <attribute name="totalReceivedBytes"
+ description="number of bytes received"
+ type="long"
+ writeable="false"/>
+ <attribute name="sendAck"
+ description="send ack after data received"
+ is="true"
+ type="boolean"
+ writeable="false" />
+ <attribute name="compress"
+ description="data received compressed"
+ is="true"
+ type="boolean"
+ writeable="false" />
+ <attribute name="doListen"
+ description="is port really started"
+ is="true"
+ type="boolean"
+ writeable="false" />
+
+ <operation name="resetStatistics"
+ description="Reset all statistics"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+
+ <operation name="start"
+ description="Start the cluster"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+
+ <operation name="stop"
+ description="Stop the cluster"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+
+ </mbean>
+
+ <mbean name="SocketReplicationListener"
+ description="Tcp Cluster SocketReplicationListener implementation"
+ domain="Catalina"
+ group="Cluster"
+ type="org.apache.catalina.cluster.tcp.SocketReplicationListener">
+ <attribute name="info"
+ description="Class version info"
+ type="java.lang.String"
+ writeable="false"/>
+ <attribute name="tcpListenAddress"
+ description="tcp listener address"
+ type="java.lang.String"/>
+ <attribute name="tcpListenPort"
+ description="tcp listener port"
+ type="int"/>
+ <attribute name="tcpListenMaxPort"
+ description="max tcp listen used port"
+ type="int"/>
+ <attribute name="tcpListenTimeout"
+ description="max tcp listen timeout (sec) wait for ServerSocket start"
+ type="int"/>
+ <attribute name="nrOfMsgsReceived"
+ description="number of messages received from other nodes"
+ type="long"
+ writeable="false"/>
+ <attribute name="receivedTime"
+ description="total time message send time"
+ type="long"
+ writeable="false"/>
+ <attribute name="receivedProcessingTime"
+ description="received processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="minReceivedProcessingTime"
+ description="minimal received processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="avgReceivedProcessingTime"
+ description="received processing time / nrOfRequests"
+ type="double"
+ writeable="false"/>
+ <attribute name="maxReceivedProcessingTime"
+ description="maximal received processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="doReceivedProcessingStats"
+ description="create received processing time stats"
+ is="true"
+ type="boolean" />
+ <attribute name="avgTotalReceivedBytes"
+ description="received totalReceivedBytes / nrOfMsgsReceived"
+ type="long"
+ writeable="false"/>
+ <attribute name="totalReceivedBytes"
+ description="number of bytes received"
+ type="long"
+ writeable="false"/>
+ <attribute name="sendAck"
+ description="send ack after data received"
+ is="true"
+ type="boolean"
+ writeable="false" />
+ <attribute name="compress"
+ description="data received compressed"
+ is="true"
+ type="boolean"
+ writeable="false" />
+ <attribute name="doListen"
+ description="is port really started"
+ is="true"
+ type="boolean"
+ writeable="false" />
+
+ <operation name="resetStatistics"
+ description="Reset all statistics"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+
+ <operation name="start"
+ description="Start the cluster"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+
+ <operation name="stop"
+ description="Stop the cluster"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+
+ </mbean>
+
+ <mbean name="ReplicationTransmitter"
+ description="Tcp replication transmitter"
+ domain="Catalina"
+ group="ClusterSender"
+ type="org.apache.catalina.cluster.tcp.ReplicationTransmitter">
+ <attribute name="info"
+ description="Class version info"
+ type="java.lang.String"
+ writeable="false"/>
+ <attribute name="replicationMode"
+ description="replication mode (synchnous,pooled.asynchnous,fastasyncqueue)"
+ type="java.lang.String"/>
+ <attribute name="ackTimeout"
+ description="acknowledge timeout"
+ type="long"/>
+ <attribute name="autoConnect"
+ description="is sender disabled, fork a new socket"
+ is="true"
+ type="boolean" />
+ <attribute name="waitForAck"
+ description="Wait for ack after data send"
+ is="true"
+ type="boolean"
+ writeable="false" />
+ <attribute name="processingTime"
+ description="sending processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="minProcessingTime"
+ description="minimal sending processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="avgProcessingTime"
+ description="processing time / nrOfRequests"
+ type="double"
+ writeable="false"/>
+ <attribute name="maxProcessingTime"
+ description="maximal sending processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="doTransmitterProcessingStats"
+ description="create processing time stats"
+ is="true"
+ type="boolean" />
+ <attribute name="nrOfRequests"
+ description="number of send messages to other members"
+ type="long"
+ writeable="false"/>
+ <attribute name="totalBytes"
+ description="number of bytes transfered"
+ type="long"
+ writeable="false"/>
+ <attribute name="failureCounter"
+ description="number of wrong transfers"
+ type="long"
+ writeable="false"/>
+ <attribute name="senderObjectNames"
+ description="get all sender object names"
+ type="[Ljavax.management.ObjectName;"
+ writeable="false"/>
+ <operation name="start"
+ description="Start the cluster"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+ <operation name="stop"
+ description="Stop the cluster"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+ <operation name="resetStatistics"
+ description="Reset all statistics"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+ <operation name="checkKeepAlive"
+ description="Check all sender connection for close socket (keepalive)"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+ </mbean>
+
+ <mbean name="AsyncSocketSender"
+ description="Async Cluster Sender"
+ domain="Catalina"
+ group="IDataSender"
+ type="org.apache.catalina.cluster.tcp.AsyncSocketSender">
+ <attribute name="info"
+ description="Class version info"
+ type="java.lang.String"
+ writeable="false"/>
+ <attribute name="address"
+ description="sender ip address"
+ type="java.net.InetAddress"
+ writeable="false"/>
+ <attribute name="port"
+ description="sender port"
+ type="int"
+ writeable="false" />
+ <attribute name="suspect"
+ description="Socket is gone"
+ type="boolean"/>
+ <attribute name="waitForAck"
+ description="Wait for ack after data send"
+ is="true"
+ type="boolean"
+ writeable="false"/>
+ <attribute name="ackTimeout"
+ description="acknowledge timeout"
+ type="long"/>
+ <attribute name="avgMessageSize"
+ writeable="false"
+ description="avg message size (totalbytes/nrOfRequests"
+ type="long"/>
+ <attribute name="queueSize"
+ writeable="false"
+ description="queue size"
+ type="int"/>
+ <attribute name="queuedNrOfBytes"
+ writeable="false"
+ description="number of bytes over all queued messages"
+ type="long"/>
+ <attribute name="messageTransferStarted"
+ description="message is in transfer"
+ type="boolean"
+ is="true"
+ writeable="false"/>
+ <attribute name="keepAliveTimeout"
+ description="active socket keep alive timeout"
+ type="long"/>
+ <attribute name="keepAliveMaxRequestCount"
+ description="max request over this socket"
+ type="int"/>
+ <attribute name="keepAliveCount"
+ description="keep Alive request count"
+ type="int"
+ writeable="false"/>
+ <attribute name="keepAliveConnectTime"
+ description="Connect time for keep alive"
+ type="long"
+ writeable="false"/>
+ <attribute name="resend"
+ description="after send failure make a resend"
+ is="true"
+ type="boolean" />
+ <attribute name="connected"
+ is="true"
+ description="socket connected"
+ type="boolean"
+ writeable="false"/>
+ <attribute name="nrOfRequests"
+ description="number of send messages to other members"
+ type="long"
+ writeable="false"/>
+ <attribute name="totalBytes"
+ description="number of bytes transfered"
+ type="long"
+ writeable="false"/>
+ <attribute name="processingTime"
+ description="sending processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="minProcessingTime"
+ description="minimal sending processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="avgProcessingTime"
+ description="processing time / nrOfRequests"
+ type="double"
+ writeable="false"/>
+ <attribute name="maxProcessingTime"
+ description="maximal sending processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="doProcessingStats"
+ description="create processing time stats"
+ is="true"
+ type="boolean" />
+ <attribute name="waitAckTime"
+ description="sending waitAck time"
+ type="long"
+ writeable="false"/>
+ <attribute name="minWaitAckTime"
+ description="minimal sending waitAck time"
+ type="long"
+ writeable="false"/>
+ <attribute name="avgWaitAckTime"
+ description="waitAck time / nrOfRequests"
+ type="double"
+ writeable="false"/>
+ <attribute name="maxWaitAckTime"
+ description="maximal sending waitAck time"
+ type="long"
+ writeable="false"/>
+ <attribute name="doWaitAckStats"
+ description="create waitAck time stats"
+ is="true"
+ type="boolean" />
+ <attribute name="connectCounter"
+ description="counts connects"
+ type="long"
+ writeable="false"/>
+ <attribute name="disconnectCounter"
+ description="counts disconnects"
+ type="long"
+ writeable="false"/>
+ <attribute name="socketOpenCounter"
+ description="counts open socket (KeepAlive and connects)"
+ type="long"
+ writeable="false"/>
+ <attribute name="socketOpenFailureCounter"
+ description="counts open socket failures"
+ type="long"
+ writeable="false"/>
+ <attribute name="socketCloseCounter"
+ description="counts closed socket (KeepAlive and disconnects)"
+ type="long"
+ writeable="false"/>
+ <attribute name="missingAckCounter"
+ description="counts missing ack"
+ type="long"
+ writeable="false"/>
+ <attribute name="dataResendCounter"
+ description="counts data resends"
+ type="long"
+ writeable="false"/>
+ <attribute name="dataFailureCounter"
+ description="counts data send failures"
+ type="long"
+ writeable="false"/>
+ <attribute name="inQueueCounter"
+ description="counts all queued messages"
+ type="long"
+ writeable="false"/>
+ <attribute name="outQueueCounter"
+ description="counts all successfully sended messages"
+ type="long"
+ writeable="false"/>
+ <operation name="connect"
+ description="connect to other replication node"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+ <operation name="disconnect"
+ description="disconnect to other replication node"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+ <operation name="checkKeepAlive"
+ description="Check connection for close socket"
+ impact="ACTION"
+ returnType="boolean">
+ </operation>
+ <operation name="resetStatistics"
+ description="Reset all statistics"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+
+ </mbean>
+
+ <mbean name="FastAsyncSocketSender"
+ description="Fast Async Cluster Sender"
+ domain="Catalina"
+ group="IDataSender"
+ type="org.apache.catalina.cluster.tcp.FastAsyncSocketSender">
+ <attribute name="info"
+ description="Class version info"
+ type="java.lang.String"
+ writeable="false"/>
+ <attribute name="threadPriority"
+ description="change queue thread priority"
+ type="int"/>
+ <attribute name="address"
+ description="sender ip address"
+ type="java.net.InetAddress"
+ writeable="false"/>
+ <attribute name="port"
+ description="sender port"
+ type="int"
+ writeable="false" />
+ <attribute name="suspect"
+ description="Socket is gone"
+ type="boolean"/>
+ <attribute name="waitForAck"
+ description="Wait for ack after data send"
+ is="true"
+ type="boolean"
+ writeable="false"/>
+ <attribute name="ackTimeout"
+ description="acknowledge timeout"
+ type="long"/>
+ <attribute name="avgMessageSize"
+ writeable="false"
+ description="avg message size (totalbytes/nrOfRequests"
+ type="long" />
+ <attribute name="queueSize"
+ writeable="false"
+ description="queue size"
+ type="int"/>
+ <attribute name="queuedNrOfBytes"
+ writeable="false"
+ description="number of bytes over all queued messages"
+ type="long"/>
+ <attribute name="messageTransferStarted"
+ description="message is in transfer"
+ type="boolean"
+ is="true"
+ writeable="false"/>
+ <attribute name="keepAliveTimeout"
+ description="active socket keep alive timeout"
+ type="long"/>
+ <attribute name="keepAliveMaxRequestCount"
+ description="max request over this socket"
+ type="int"/>
+ <attribute name="queueAddWaitTimeout"
+ description="add wait timeout (default 10000 msec)"
+ type="long"/>
+ <attribute name="queueRemoveWaitTimeout"
+ description="remove wait timeout (default 30000 msec)"
+ type="long"/>
+ <attribute name="maxQueueLength"
+ description="max queue length"
+ type="int"/>
+ <attribute name="queueTimeWait"
+ description="remember queue wait times"
+ is="true"
+ type="boolean"/>
+ <attribute name="queueCheckLock"
+ description="check to lost locks"
+ is="true"
+ type="boolean"/>
+ <attribute name="queueDoStats"
+ description="activated queue stats"
+ is="true"
+ type="boolean"/>
+ <attribute name="keepAliveCount"
+ description="keep Alive request count"
+ type="int"
+ writeable="false"/>
+ <attribute name="keepAliveConnectTime"
+ description="Connect time for keep alive"
+ type="long"
+ writeable="false"/>
+ <attribute name="resend"
+ description="after send failure make a resend"
+ is="true"
+ type="boolean" />
+ <attribute name="connected"
+ is="true"
+ description="socket connected"
+ type="boolean"
+ writeable="false"/>
+ <attribute name="nrOfRequests"
+ description="number of send messages to other members"
+ type="long"
+ writeable="false"/>
+ <attribute name="totalBytes"
+ description="number of bytes transfered"
+ type="long"
+ writeable="false"/>
+ <attribute name="processingTime"
+ description="sending processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="minProcessingTime"
+ description="minimal sending processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="avgProcessingTime"
+ description="processing time / nrOfRequests"
+ type="double"
+ writeable="false"/>
+ <attribute name="maxProcessingTime"
+ description="maximal sending processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="doProcessingStats"
+ description="create Processing time stats"
+ is="true"
+ type="boolean" />
+ <attribute name="waitAckTime"
+ description="sending waitAck time"
+ type="long"
+ writeable="false"/>
+ <attribute name="minWaitAckTime"
+ description="minimal sending waitAck time"
+ type="long"
+ writeable="false"/>
+ <attribute name="avgWaitAckTime"
+ description="waitAck time / nrOfRequests"
+ type="double"
+ writeable="false"/>
+ <attribute name="maxWaitAckTime"
+ description="maximal sending waitAck time"
+ type="long"
+ writeable="false"/>
+ <attribute name="doWaitAckStats"
+ description="create waitAck time stats"
+ is="true"
+ type="boolean" />
+ <attribute name="connectCounter"
+ description="counts connects"
+ type="long"
+ writeable="false"/>
+ <attribute name="disconnectCounter"
+ description="counts disconnects"
+ type="long"
+ writeable="false"/>
+ <attribute name="socketOpenCounter"
+ description="counts open socket (KeepAlive and connects)"
+ type="long"
+ writeable="false"/>
+ <attribute name="socketOpenFailureCounter"
+ description="counts open socket failures"
+ type="long"
+ writeable="false"/>
+ <attribute name="socketCloseCounter"
+ description="counts closed socket (KeepAlive and disconnects)"
+ type="long"
+ writeable="false"/>
+ <attribute name="missingAckCounter"
+ description="counts missing ack"
+ type="long"
+ writeable="false"/>
+ <attribute name="dataResendCounter"
+ description="counts data resends"
+ type="long"
+ writeable="false"/>
+ <attribute name="dataFailureCounter"
+ description="counts data send failures"
+ type="long"
+ writeable="false"/>
+ <attribute name="inQueueCounter"
+ description="counts all queued messages"
+ type="long"
+ writeable="false"/>
+ <attribute name="outQueueCounter"
+ description="counts all successfully sended messages"
+ type="long"
+ writeable="false"/>
+ <attribute name="queueAddWaitTime"
+ description="queue add wait time (tomcat thread waits)"
+ type="long"
+ writeable="false"/>
+ <attribute name="queueRemoveWaitTime"
+ description="queue remove wait time (queue thread waits)"
+ type="long"
+ writeable="false"/>
+ <operation name="connect"
+ description="connect to other replication node"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+ <operation name="disconnect"
+ description="disconnect to other replication node"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+ <operation name="checkKeepAlive"
+ description="Check connection for close socket"
+ impact="ACTION"
+ returnType="boolean">
+ </operation>
+ <operation name="resetStatistics"
+ description="Reset all statistics"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+
+ </mbean>
+
+ <mbean name="PooledSocketSender"
+ description="Pooled Cluster Sender"
+ domain="Catalina"
+ group="IDataSender"
+ type="org.apache.catalina.cluster.tcp.PooledSocketSender">
+ <attribute name="address"
+ description="sender ip address"
+ type="java.net.InetAddress"
+ writeable="false"/>
+ <attribute name="port"
+ description="sender port"
+ type="int"
+ writeable="false" />
+ <attribute name="suspect"
+ description="Socket is gone"
+ type="boolean"/>
+ <attribute name="ackTimeout"
+ description="acknowledge timeout"
+ type="long"/>
+ <attribute name="waitForAck"
+ description="Wait for ack after data send"
+ is="true"
+ type="boolean"
+ writeable="false" />
+ <attribute name="maxPoolSocketLimit"
+ description="Max parallel sockets"
+ type="int"/>
+ <attribute name="keepAliveTimeout"
+ description="active socket keep alive timeout"
+ type="long"/>
+ <attribute name="keepAliveMaxRequestCount"
+ description="max request over this socket"
+ type="int"/>
+ <attribute name="resend"
+ description="after send failure make a resend"
+ is="true"
+ type="boolean" />
+ <attribute name="connected"
+ is="true"
+ description="socket connected"
+ type="boolean"
+ writeable="false"/>
+ <attribute name="avgMessageSize"
+ writeable="false"
+ description="avg message size (totalbytes/nrOfRequests"
+ type="long"/>
+ <attribute name="nrOfRequests"
+ description="number of send messages to other members"
+ type="long"
+ writeable="false"/>
+ <attribute name="totalBytes"
+ description="number of bytes transfered"
+ type="long"
+ writeable="false"/>
+ <attribute name="connectCounter"
+ description="counts connects"
+ type="long"
+ writeable="false"/>
+ <attribute name="disconnectCounter"
+ description="counts disconnects"
+ type="long"
+ writeable="false"/>
+ <operation name="connect"
+ description="start Queue to connect to ohter replication node"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+ <operation name="disconnect"
+ description="stop Queue to other replication node"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+ <operation name="resetStatistics"
+ description="Reset all statistics"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+
+ </mbean>
+
+ <mbean name="SocketSender"
+ description="Sync Cluster Sender"
+ domain="Catalina"
+ group="IDataSender"
+ type="org.apache.catalina.cluster.tcp.SocketSender">
+ <attribute name="address"
+ description="sender ip address"
+ type="java.net.InetAddress"
+ writeable="false"/>
+ <attribute name="port"
+ description="sender port"
+ type="int"
+ writeable="false" />
+ <attribute name="suspect"
+ description="Socket is gone"
+ type="boolean"/>
+ <attribute name="ackTimeout"
+ description="acknowledge timeout"
+ type="long"/>
+ <attribute name="waitForAck"
+ description="Wait for ack after data send"
+ is="true"
+ type="boolean"
+ writeable="false" />
+ <attribute name="keepAliveTimeout"
+ description="active socket keep alive timeout"
+ type="long"/>
+ <attribute name="keepAliveMaxRequestCount"
+ description="max request over this socket"
+ type="int"/>
+ <attribute name="messageTransferStarted"
+ description="message is in transfer"
+ type="boolean"
+ is="true"
+ writeable="false"/>
+ <attribute name="keepAliveCount"
+ description="keep Alive request count"
+ type="int"
+ writeable="false"/>
+ <attribute name="keepAliveConnectTime"
+ description="Connect time for keep alive"
+ type="long"
+ writeable="false"/>
+ <attribute name="resend"
+ description="after send failure make a resend"
+ is="true"
+ type="boolean" />
+ <attribute name="connected"
+ is="true"
+ description="socket connected"
+ type="boolean"
+ writeable="false"/>
+ <attribute name="avgMessageSize"
+ writeable="false"
+ description="avg message size (totalbytes/nrOfRequests"
+ type="long"/>
+ <attribute name="nrOfRequests"
+ description="number of send messages to other members"
+ type="long"
+ writeable="false"/>
+ <attribute name="totalBytes"
+ description="number of bytes transfered"
+ type="long"
+ writeable="false"/>
+ <attribute name="processingTime"
+ description="sending processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="minProcessingTime"
+ description="minimal sending processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="avgProcessingTime"
+ description="processing time / nrOfRequests"
+ type="double"
+ writeable="false"/>
+ <attribute name="maxProcessingTime"
+ description="maximal sending processing time"
+ type="long"
+ writeable="false"/>
+ <attribute name="doProcessingStats"
+ description="create Processing time stats"
+ is="true"
+ type="boolean" />
+ <attribute name="waitAckTime"
+ description="sending waitAck time"
+ type="long"
+ writeable="false"/>
+ <attribute name="minWaitAckTime"
+ description="minimal sending waitAck time"
+ type="long"
+ writeable="false"/>
+ <attribute name="avgWaitAckTime"
+ description="waitAck time / nrOfRequests"
+ type="double"
+ writeable="false"/>
+ <attribute name="maxWaitAckTime"
+ description="maximal sending waitAck time"
+ type="long"
+ writeable="false"/>
+ <attribute name="doWaitAckStats"
+ description="create waitAck time stats"
+ is="true"
+ type="boolean" />
+ <attribute name="connectCounter"
+ description="counts connects"
+ type="long"
+ writeable="false"/>
+ <attribute name="disconnectCounter"
+ description="counts disconnects"
+ type="long"
+ writeable="false"/>
+ <attribute name="socketCloseCounter"
+ description="counts closed socket (KeepAlive and disconnects)"
+ type="long"
+ writeable="false"/>
+ <attribute name="socketOpenFailureCounter"
+ description="counts open socket failures"
+ type="long"
+ writeable="false"/>
+ <attribute name="socketOpenCounter"
+ description="counts open socket (KeepAlive and connects)"
+ type="long"
+ writeable="false"/>
+ <attribute name="missingAckCounter"
+ description="counts missing ack"
+ type="long"
+ writeable="false"/>
+ <attribute name="dataResendCounter"
+ description="counts data resends"
+ type="long"
+ writeable="false"/>
+ <attribute name="dataFailureCounter"
+ description="counts data send failures"
+ type="long"
+ writeable="false"/>
+ <operation name="connect"
+ description="connect to other replication node"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+ <operation name="disconnect"
+ description="disconnect to other replication node"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+ <operation name="checkKeepAlive"
+ description="Check connection for close socket"
+ impact="ACTION"
+ returnType="boolean">
+ </operation>
+ <operation name="resetStatistics"
+ description="Reset all statistics"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+
+ </mbean>
+
+ <mbean name="ReplicationValve"
+ description="Valve for simple tcp replication"
+ domain="Catalina"
+ group="Valve"
+ type="org.apache.catalina.cluster.tcp.ReplicationValve">
+ <attribute name="info"
+ description="Class version info"
+ type="java.lang.String"
+ writeable="false"/>
+ <attribute name="filter"
+ description="resource filter to disable session replication check"
+ type="java.lang.String"/>
+ <attribute name="primaryIndicator"
+ is="true"
+ description="set indicator that request processing is at primary session node"
+ type="boolean"/>
+ <attribute name="primaryIndicatorName"
+ description="Request attribute name to indicate that request processing is at primary session node"
+ type="java.lang.String"/>
+ <attribute name="doProcessingStats"
+ is="true"
+ description="active statistics counting"
+ type="boolean"/>
+ <attribute name="nrOfRequests"
+ description="number of replicated requests"
+ type="long"
+ writeable="false"/>
+ <attribute name="nrOfFilterRequests"
+ description="number of filtered requests"
+ type="long"
+ writeable="false"/>
+ <attribute name="nrOfSendRequests"
+ description="number of send requests"
+ type="long"
+ writeable="false"/>
+ <attribute name="nrOfCrossContextSendRequests"
+ description="number of send cross context session requests"
+ type="long"
+ writeable="false"/>
+ <attribute name="totalRequestTime"
+ description="total replicated request time"
+ type="long"
+ writeable="false"/>
+ <attribute name="totalSendTime"
+ description="total replicated send time"
+ type="long"
+ writeable="false"/>
+ <attribute name="lastSendTime"
+ description="last replicated request time"
+ type="long"
+ writeable="false"/>
+ <operation name="resetStatistics"
+ description="Reset all statistics"
+ impact="ACTION"
+ returnType="void">
+ </operation>
+
+ </mbean>
+
+
+</mbeans-descriptors>
Added: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/FastQueue.java
URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/FastQueue.java?rev=380209&view=auto
==============================================================================
--- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/FastQueue.java (added)
+++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/FastQueue.java Thu Feb 23 11:55:14 2006
@@ -0,0 +1,625 @@
+/*
+ * Copyright 1999,2004-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.catalina.cluster.util;
+
+/**
+ * A fast queue that remover thread lock the adder thread. <br/>Limit the queue
+ * length when you have strange producer thread problemes.
+ *
+ * FIXME add i18n support to log messages
+ * @author Rainer Jung
+ * @author Peter Rossbach
+ * @version $Revision: 345567 $ $Date: 2005-11-18 15:07:23 -0600 (Fri, 18 Nov 2005) $
+ */
+public class FastQueue implements IQueue {
+
+ private static org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory
+ .getLog(FastQueue.class);
+
+ /**
+ * This is the actual queue
+ */
+ private SingleRemoveSynchronizedAddLock lock = null;
+
+ /**
+ * First Object at queue (consumer message)
+ */
+ private LinkObject first = null;
+
+ /**
+ * Last object in queue (producer Object)
+ */
+ private LinkObject last = null;
+
+ /**
+ * Current Queue elements size
+ */
+ private int size = 0;
+
+ /**
+ * check lock to detect strange threadings things
+ */
+ private boolean checkLock = false;
+
+ /**
+ * protocol the thread wait times
+ */
+ private boolean timeWait = false;
+
+ /**
+ * calc stats data
+ */
+ private boolean doStats = false;
+
+ private boolean inAdd = false;
+
+ private boolean inRemove = false;
+
+ private boolean inMutex = false;
+
+ /**
+ * limit the queue legnth ( default is unlimited)
+ */
+ private int maxQueueLength = 0;
+
+ /**
+ * addWaitTimeout for producer
+ */
+ private long addWaitTimeout = 10000L;
+
+
+ /**
+ * removeWaitTimeout for consumer
+ */
+ private long removeWaitTimeout = 30000L;
+
+ /**
+ * enabled the queue
+ */
+ private boolean enabled = true;
+
+ /**
+ * calc all add objects
+ */
+ private long addCounter = 0;
+
+ /**
+ * calc all add objetcs in error state ( see limit queue length)
+ */
+ private long addErrorCounter = 0;
+
+ /**
+ * calc all remove objects
+ */
+ private long removeCounter = 0;
+
+ /**
+ * calc all remove objects failures (hupps probleme detection)
+ */
+ private long removeErrorCounter = 0;
+
+ /**
+ * Calc wait time thread
+ */
+ private long addWait = 0;
+
+ /**
+ * Calc remove time threads
+ */
+ private long removeWait = 0;
+
+ /**
+ * max queue size
+ */
+ private int maxSize = 0;
+
+ /**
+ * avg queue size
+ */
+ private long avgSize = 0;
+
+ private int maxSizeSample = 0;
+
+ private long avgSizeSample = 0;
+
+ /**
+ * avg size sample interval
+ */
+ private int sampleInterval = 100;
+
+ /**
+ * Generate Queue SingleRemoveSynchronizedAddLock and set add and wait
+ * Timeouts
+ */
+ public FastQueue() {
+ lock = new SingleRemoveSynchronizedAddLock();
+ lock.setAddWaitTimeout(addWaitTimeout);
+ lock.setRemoveWaitTimeout(removeWaitTimeout);
+ }
+
+ /**
+ * get current add wait timeout
+ *
+ * @return current wait timeout
+ */
+ public long getAddWaitTimeout() {
+ addWaitTimeout = lock.getAddWaitTimeout();
+ return addWaitTimeout;
+ }
+
+ /**
+ * Set add wait timeout (default 10000 msec)
+ *
+ * @param timeout
+ */
+ public void setAddWaitTimeout(long timeout) {
+ addWaitTimeout = timeout;
+ lock.setAddWaitTimeout(addWaitTimeout);
+ }
+
+ /**
+ * get current remove wait timeout
+ *
+ * @return The timeout
+ */
+ public long getRemoveWaitTimeout() {
+ removeWaitTimeout = lock.getRemoveWaitTimeout();
+ return removeWaitTimeout;
+ }
+
+ /**
+ * set remove wait timeout ( default 30000 msec)
+ *
+ * @param timeout
+ */
+ public void setRemoveWaitTimeout(long timeout) {
+ removeWaitTimeout = timeout;
+ lock.setRemoveWaitTimeout(removeWaitTimeout);
+ }
+
+ /**
+ * get Max Queue length
+ *
+ * @see org.apache.catalina.cluster.util.IQueue#getMaxQueueLength()
+ */
+ public int getMaxQueueLength() {
+ return maxQueueLength;
+ }
+
+ public void setMaxQueueLength(int length) {
+ maxQueueLength = length;
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(boolean enable) {
+ enabled = enable;
+ if (!enabled) {
+ lock.abortRemove();
+ }
+ }
+
+ /**
+ * @return Returns the checkLock.
+ */
+ public boolean isCheckLock() {
+ return checkLock;
+ }
+
+ /**
+ * @param checkLock The checkLock to set.
+ */
+ public void setCheckLock(boolean checkLock) {
+ this.checkLock = checkLock;
+ }
+
+ /**
+ * @return Returns the doStats.
+ */
+ public boolean isDoStats() {
+ return doStats;
+ }
+
+ /**
+ * @param doStats The doStats to set.
+ */
+ public void setDoStats(boolean doStats) {
+ this.doStats = doStats;
+ }
+
+ /**
+ * @return Returns the timeWait.
+ */
+ public boolean isTimeWait() {
+ return timeWait;
+ }
+
+ /**
+ * @param timeWait The timeWait to set.
+ */
+ public void setTimeWait(boolean timeWait) {
+ this.timeWait = timeWait;
+ }
+
+ public int getSampleInterval() {
+ return sampleInterval;
+ }
+
+ public void setSampleInterval(int interval) {
+ sampleInterval = interval;
+ }
+
+ public long getAddCounter() {
+ return addCounter;
+ }
+
+ public void setAddCounter(long counter) {
+ addCounter = counter;
+ }
+
+ public long getAddErrorCounter() {
+ return addErrorCounter;
+ }
+
+ public void setAddErrorCounter(long counter) {
+ addErrorCounter = counter;
+ }
+
+ public long getRemoveCounter() {
+ return removeCounter;
+ }
+
+ public void setRemoveCounter(long counter) {
+ removeCounter = counter;
+ }
+
+ public long getRemoveErrorCounter() {
+ return removeErrorCounter;
+ }
+
+ public void setRemoveErrorCounter(long counter) {
+ removeErrorCounter = counter;
+ }
+
+ public long getAddWait() {
+ return addWait;
+ }
+
+ public void setAddWait(long wait) {
+ addWait = wait;
+ }
+
+ public long getRemoveWait() {
+ return removeWait;
+ }
+
+ public void setRemoveWait(long wait) {
+ removeWait = wait;
+ }
+
+ /**
+ * @return The max size
+ */
+ public int getMaxSize() {
+ return maxSize;
+ }
+
+ /**
+ * @param size
+ */
+ public void setMaxSize(int size) {
+ maxSize = size;
+ }
+
+
+ /**
+ * Avg queue size
+ * @return The average queue size
+ */
+ public long getAvgSize() {
+ if (addCounter > 0) {
+ return avgSize / addCounter;
+ } else {
+ return 0;
+ }
+ }
+
+ /**
+ * reset all stats data
+ */
+ public void resetStatistics() {
+ addCounter = 0;
+ addErrorCounter = 0;
+ removeCounter = 0;
+ removeErrorCounter = 0;
+ avgSize = 0;
+ maxSize = 0;
+ addWait = 0;
+ removeWait = 0;
+ }
+
+ /**
+ * unlock queue for next add
+ */
+ public void unlockAdd() {
+ lock.unlockAdd(size > 0 ? true : false);
+ }
+
+ /**
+ * unlock queue for next remove
+ */
+ public void unlockRemove() {
+ lock.unlockRemove();
+ }
+
+ /**
+ * start queuing
+ */
+ public void start() {
+ setEnabled(true);
+ }
+
+ /**
+ * start queuing
+ */
+ public void stop() {
+ setEnabled(false);
+ }
+
+ public long getSample() {
+ return addCounter % sampleInterval;
+ }
+
+ public int getMaxSizeSample() {
+ return maxSizeSample;
+ }
+
+ public void setMaxSizeSample(int size) {
+ maxSizeSample = size;
+ }
+
+ public long getAvgSizeSample() {
+ long sample = addCounter % sampleInterval;
+ if (sample > 0) {
+ return avgSizeSample / sample;
+ } else if (addCounter > 0) {
+ return avgSizeSample / sampleInterval;
+ } else {
+ return 0;
+ }
+ }
+
+ public int getSize() {
+ int sz;
+ sz = size;
+ return sz;
+ }
+
+ /**
+ * Add new data to the queue
+ * @see org.apache.catalina.cluster.util.IQueue#add(java.lang.String, java.lang.Object)
+ * FIXME extract some method
+ */
+ public boolean add(String key, Object data) {
+ boolean ok = true;
+ long time = 0;
+
+ if (!enabled) {
+ if (log.isInfoEnabled())
+ log.info("FastQueue.add: queue disabled, add aborted");
+ return false;
+ }
+
+ if (timeWait) {
+ time = System.currentTimeMillis();
+ }
+ lock.lockAdd();
+ try {
+ if (timeWait) {
+ addWait += (System.currentTimeMillis() - time);
+ }
+
+ if (log.isTraceEnabled()) {
+ log.trace("FastQueue.add: starting with size " + size);
+ }
+ if (checkLock) {
+ if (inAdd)
+ log.warn("FastQueue.add: Detected other add");
+ inAdd = true;
+ if (inMutex)
+ log.warn("FastQueue.add: Detected other mutex in add");
+ inMutex = true;
+ }
+
+ if ((maxQueueLength > 0) && (size >= maxQueueLength)) {
+ ok = false;
+ if (log.isTraceEnabled()) {
+ log.trace("FastQueue.add: Could not add, since queue is full ("
+ + size + ">=" + maxQueueLength + ")");
+ }
+
+ } else {
+ LinkObject element = new LinkObject(key, data);
+ if (size == 0) {
+ first = last = element;
+ size = 1;
+ } else {
+ if (last == null) {
+ ok = false;
+ log
+ .error("FastQueue.add: Could not add, since last is null although size is "
+ + size + " (>0)");
+ } else {
+ last.append(element);
+ last = element;
+ size++;
+ }
+ }
+
+ }
+
+ if (doStats) {
+ if (ok) {
+ if (addCounter % sampleInterval == 0) {
+ maxSizeSample = 0;
+ avgSizeSample = 0;
+ }
+ addCounter++;
+ if (size > maxSize) {
+ maxSize = size;
+ }
+ if (size > maxSizeSample) {
+ maxSizeSample = size;
+ }
+ avgSize += size;
+ avgSizeSample += size;
+ } else {
+ addErrorCounter++;
+ }
+ }
+
+ if (first == null) {
+ log.error("FastQueue.add: first is null, size is " + size
+ + " at end of add");
+ }
+ if (last == null) {
+ log.error("FastQueue.add: last is null, size is " + size
+ + " at end of add");
+ }
+
+ if (checkLock) {
+ if (!inMutex)
+ log.warn("FastQueue.add: Cancelled by other mutex in add");
+ inMutex = false;
+ if (!inAdd)
+ log.warn("FastQueue.add: Cancelled by other add");
+ inAdd = false;
+ }
+ if (log.isTraceEnabled()) {
+ log.trace("FastQueue.add: add ending with size " + size);
+ }
+
+ if (timeWait) {
+ time = System.currentTimeMillis();
+ }
+ } finally {
+ lock.unlockAdd(true);
+ }
+ if (timeWait) {
+ addWait += (System.currentTimeMillis() - time);
+ }
+ return ok;
+ }
+
+ /**
+ * remove the complete queued object list
+ * @see org.apache.catalina.cluster.util.IQueue#remove()
+ * FIXME extract some method
+ */
+ public LinkObject remove() {
+ LinkObject element;
+ boolean gotLock;
+ long time = 0;
+
+ if (!enabled) {
+ if (log.isInfoEnabled())
+ log.info("FastQueue.remove: queue disabled, remove aborted");
+ return null;
+ }
+
+ if (timeWait) {
+ time = System.currentTimeMillis();
+ }
+ gotLock = lock.lockRemove();
+ try {
+
+ if (!gotLock) {
+ if (enabled) {
+ if (timeWait) {
+ removeWait += (System.currentTimeMillis() - time);
+ }
+ if (doStats) {
+ removeErrorCounter++;
+ }
+ if (log.isInfoEnabled())
+ log.info("FastQueue.remove: Remove aborted although queue enabled");
+ } else {
+ if (log.isInfoEnabled())
+ log.info("FastQueue.remove: queue disabled, remove aborted");
+ }
+ return null;
+ }
+
+ if (timeWait) {
+ removeWait += (System.currentTimeMillis() - time);
+ }
+
+ if (log.isTraceEnabled()) {
+ log.trace("FastQueue.remove: remove starting with size " + size);
+ }
+ if (checkLock) {
+ if (inRemove)
+ log.warn("FastQueue.remove: Detected other remove");
+ inRemove = true;
+ if (inMutex)
+ log.warn("FastQueue.remove: Detected other mutex in remove");
+ inMutex = true;
+ }
+
+ element = first;
+
+ if (doStats) {
+ if (element != null) {
+ removeCounter++;
+ } else {
+ removeErrorCounter++;
+ log
+ .error("FastQueue.remove: Could not remove, since first is null although size is "
+ + size + " (>0)");
+ }
+ }
+
+ first = last = null;
+ size = 0;
+
+ if (checkLock) {
+ if (!inMutex)
+ log.warn("FastQueue.remove: Cancelled by other mutex in remove");
+ inMutex = false;
+ if (!inRemove)
+ log.warn("FastQueue.remove: Cancelled by other remove");
+ inRemove = false;
+ }
+ if (log.isTraceEnabled()) {
+ log.trace("FastQueue.remove: remove ending with size " + size);
+ }
+
+ if (timeWait) {
+ time = System.currentTimeMillis();
+ }
+ } finally {
+ lock.unlockRemove();
+ }
+ if (timeWait) {
+ removeWait += (System.currentTimeMillis() - time);
+ }
+ return element;
+ }
+
+}
Added: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/IDynamicProperty.java
URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/IDynamicProperty.java?rev=380209&view=auto
==============================================================================
--- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/IDynamicProperty.java (added)
+++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/IDynamicProperty.java Thu Feb 23 11:55:14 2006
@@ -0,0 +1,57 @@
+/*
+ * Copyright 1999,2004-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.catalina.cluster.util;
+
+import java.util.Iterator;
+
+/**
+ * @author Peter Rossbach
+ * @version $Revision: 304032 $, $Date: 2005-07-27 10:11:55 -0500 (Wed, 27 Jul 2005) $
+ */
+
+public interface IDynamicProperty {
+
+ /**
+ * set config attributes with reflect
+ *
+ * @param name
+ * @param value
+ */
+ public void setProperty(String name, Object value) ;
+
+ /**
+ * get current config
+ *
+ * @param key
+ * @return The property
+ */
+ public Object getProperty(String key) ;
+ /**
+ * Get all properties keys
+ *
+ * @return An iterator over the property names
+ */
+ public Iterator getPropertyNames() ;
+
+ /**
+ * remove a configured property.
+ *
+ * @param key
+ */
+ public void removeProperty(String key) ;
+
+}
Added: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/IQueue.java
URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/IQueue.java?rev=380209&view=auto
==============================================================================
--- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/IQueue.java (added)
+++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/IQueue.java Thu Feb 23 11:55:14 2006
@@ -0,0 +1,35 @@
+/*
+ * Copyright 1999,2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.catalina.cluster.util;
+
+/**
+ * A queue interface<BR>
+ *
+ * @author Rainer Jung
+ * @author Peter Rossbach
+ * @version $Revision: 303753 $ $Date: 2005-03-14 15:24:30 -0600 (Mon, 14 Mar 2005) $
+ */
+
+public interface IQueue {
+
+ public LinkObject remove();
+ public boolean add(String key,Object data);
+ public int getMaxQueueLength();
+ public void setMaxQueueLength(int length);
+ public void start();
+ public void stop();
+}
Added: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/LinkObject.java
URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/LinkObject.java?rev=380209&view=auto
==============================================================================
--- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/LinkObject.java (added)
+++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/LinkObject.java Thu Feb 23 11:55:14 2006
@@ -0,0 +1,81 @@
+/*
+ * Copyright 1999,2004-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.catalina.cluster.util;
+
+/**
+ * The class <b>LinkObject</b> implements an element
+ * for a linked list, consisting of a general
+ * data object and a pointer to the next element.
+ *
+ * @author Rainer Jung
+ * @author Peter Rossbach
+ * @version $Revision: 304032 $ $Date: 2005-07-27 10:11:55 -0500 (Wed, 27 Jul 2005) $
+
+ */
+
+public class LinkObject {
+
+ private Object payload;
+ private LinkObject next;
+ private String key ;
+
+ /**
+ * Construct a new element from the data object.
+ * Sets the pointer to null.
+ *
+ * @param key The key
+ * @param payload The data object.
+ */
+ public LinkObject(String key,Object payload) {
+ this.payload = payload;
+ this.next = null;
+ this.key = key ;
+ }
+
+ /**
+ * Set the next element.
+ * @param next The next element.
+ */
+ public void append(LinkObject next) {
+ this.next = next;
+ }
+
+ /**
+ * Get the next element.
+ * @return The next element.
+ */
+ public LinkObject next() {
+ return next;
+ }
+
+ /**
+ * Get the data object from the element.
+ * @return The data object from the element.
+ */
+ public Object data() {
+ return payload;
+ }
+
+ /**
+ * Get the unique message id
+ * @return the unique message id
+ */
+ public Object getKey() {
+ return key;
+ }
+
+}
Added: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/SingleRemoveSynchronizedAddLock.java
URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/SingleRemoveSynchronizedAddLock.java?rev=380209&view=auto
==============================================================================
--- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/SingleRemoveSynchronizedAddLock.java (added)
+++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/SingleRemoveSynchronizedAddLock.java Thu Feb 23 11:55:14 2006
@@ -0,0 +1,251 @@
+/*
+ * Copyright 1999,2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.catalina.cluster.util;
+
+/**
+ * The class <b>SingleRemoveSynchronizedAddLock</b> implement locking for accessing the queue
+ * by a single remove thread and multiple add threads.
+ *
+ * A thread is only allowed to be either the remove or
+ * an add thread.
+ *
+ * The lock can either be owned by the remove thread
+ * or by a single add thread.
+ *
+ * If the remove thread tries to get the lock,
+ * but the queue is empty, it will block (poll)
+ * until an add threads adds an entry to the queue and
+ * releases the lock.
+ *
+ * If the remove thread and add threads compete for
+ * the lock and an add thread releases the lock, then
+ * the remove thread will get the lock first.
+ *
+ * The remove thread removes all entries in the queue
+ * at once and proceeses them without further
+ * polling the queue.
+ *
+ * The lock is not reentrant, in the sense, that all
+ * threads must release an owned lock before competing
+ * for the lock again!
+ *
+ * @author Rainer Jung
+ * @author Peter Rossbach
+ * @version 1.1
+ */
+
+public class SingleRemoveSynchronizedAddLock {
+
+ public SingleRemoveSynchronizedAddLock() {
+ }
+
+ public SingleRemoveSynchronizedAddLock(boolean dataAvailable) {
+ this.dataAvailable=dataAvailable;
+ }
+
+ /**
+ * Time in milliseconds after which threads
+ * waiting for an add lock are woken up.
+ * This is used as a safety measure in case
+ * thread notification via the unlock methods
+ * has a bug.
+ */
+ private long addWaitTimeout = 10000L;
+
+ /**
+ * Time in milliseconds after which threads
+ * waiting for a remove lock are woken up.
+ * This is used as a safety measure in case
+ * thread notification via the unlock methods
+ * has a bug.
+ */
+ private long removeWaitTimeout = 30000L;
+
+ /**
+ * The current remove thread.
+ * It is set to the remove thread polling for entries.
+ * It is reset to null when the remove thread
+ * releases the lock and proceeds processing
+ * the removed entries.
+ */
+ private Thread remover = null;
+
+ /**
+ * A flag indicating, if an add thread owns the lock.
+ */
+ private boolean addLocked = false;
+
+ /**
+ * A flag indicating, if the remove thread owns the lock.
+ */
+ private boolean removeLocked = false;
+
+ /**
+ * A flag indicating, if the remove thread is allowed
+ * to wait for the lock. The flag is set to false, when aborting.
+ */
+ private boolean removeEnabled = true;
+
+ /**
+ * A flag indicating, if the remover needs polling.
+ * It indicates, if the locked object has data available
+ * to be removed.
+ */
+ private boolean dataAvailable = false;
+
+ /**
+ * @return Value of addWaitTimeout
+ */
+ public synchronized long getAddWaitTimeout() {
+ return addWaitTimeout;
+ }
+
+ /**
+ * Set value of addWaitTimeout
+ */
+ public synchronized void setAddWaitTimeout(long timeout) {
+ addWaitTimeout = timeout;
+ }
+
+ /**
+ * @return Value of removeWaitTimeout
+ */
+ public synchronized long getRemoveWaitTimeout() {
+ return removeWaitTimeout;
+ }
+
+ /**
+ * Set value of removeWaitTimeout
+ */
+ public synchronized void setRemoveWaitTimeout(long timeout) {
+ removeWaitTimeout = timeout;
+ }
+
+ /**
+ * Check if the locked object has data available
+ * i.e. the remover can stop poling and get the lock.
+ * @return True iff the lock Object has data available.
+ */
+ public synchronized boolean isDataAvailable() {
+ return dataAvailable;
+ }
+
+ /**
+ * Check if an add thread owns the lock.
+ * @return True iff an add thread owns the lock.
+ */
+ public synchronized boolean isAddLocked() {
+ return addLocked;
+ }
+
+ /**
+ * Check if the remove thread owns the lock.
+ * @return True iff the remove thread owns the lock.
+ */
+ public synchronized boolean isRemoveLocked() {
+ return removeLocked;
+ }
+
+ /**
+ * Check if the remove thread is polling.
+ * @return True iff the remove thread is polling.
+ */
+ public synchronized boolean isRemovePolling() {
+ if ( remover != null ) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Acquires the lock by an add thread and sets the add flag.
+ * If any add thread or the remove thread already acquired the lock
+ * this add thread will block until the lock is released.
+ */
+ public synchronized void lockAdd() {
+ if ( addLocked || removeLocked ) {
+ do {
+ try {
+ wait(addWaitTimeout);
+ } catch ( InterruptedException e ) {
+ }
+ } while ( addLocked || removeLocked );
+ }
+ addLocked=true;
+ }
+
+ /**
+ * Acquires the lock by the remove thread and sets the remove flag.
+ * If any add thread already acquired the lock or the queue is
+ * empty, the remove thread will block until the lock is released
+ * and the queue is not empty.
+ */
+ public synchronized boolean lockRemove() {
+ removeLocked=false;
+ removeEnabled=true;
+ if ( ( addLocked || ! dataAvailable ) && removeEnabled ) {
+ remover=Thread.currentThread();
+ do {
+ try {
+ wait(removeWaitTimeout);
+ } catch ( InterruptedException e ) {
+ }
+ } while ( ( addLocked || ! dataAvailable ) && removeEnabled );
+ remover=null;
+ }
+ if ( removeEnabled ) {
+ removeLocked=true;
+ }
+ return removeLocked;
+ }
+
+ /**
+ * Releases the lock by an add thread and reset the remove flag.
+ * If the reader thread is polling, notify it.
+ */
+ public synchronized void unlockAdd(boolean dataAvailable) {
+ addLocked=false;
+ this.dataAvailable=dataAvailable;
+ if ( ( remover != null ) && ( dataAvailable || ! removeEnabled ) ) {
+ remover.interrupt();
+ } else {
+ notifyAll();
+ }
+ }
+
+ /**
+ * Releases the lock by the remove thread and reset the add flag.
+ * Notify all waiting add threads,
+ * that the lock has been released by the remove thread.
+ */
+ public synchronized void unlockRemove() {
+ removeLocked=false;
+ dataAvailable=false;
+ notifyAll();
+ }
+
+ /**
+ * Abort any polling remover thread
+ */
+ public synchronized void abortRemove() {
+ removeEnabled=false;
+ if ( remover != null ) {
+ remover.interrupt();
+ }
+ }
+
+}
Added: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/SmartQueue.java
URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/SmartQueue.java?rev=380209&view=auto
==============================================================================
--- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/SmartQueue.java (added)
+++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/cluster/util/SmartQueue.java Thu Feb 23 11:55:14 2006
@@ -0,0 +1,189 @@
+/*
+ * Copyright 1999,2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.catalina.cluster.util;
+
+/**
+ * A smart queue, used for async replication <BR>
+ * the "smart" part of this queue is that if the session is already queued for
+ * replication, and it is updated again, the session will simply be replaced,
+ * hence we don't replicate stuff that is obsolete. Put this into util, since it
+ * is quite generic.
+ *
+ * @author Filip Hanik
+ * @version 1.0
+ */
+
+import java.util.LinkedList;
+import java.util.HashMap;
+
+public class SmartQueue {
+
+ public static org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory
+ .getLog(SmartQueue.class);
+
+ /**
+ * This is the actual queue
+ */
+ private LinkedList queue = new LinkedList();
+
+ /**
+ * And this is only for performance, fast lookups
+ */
+ private HashMap queueMap = new HashMap();
+
+ private Object mutex = new Object();
+
+ public SmartQueue() {
+ }
+
+ /**
+ * Add an object to the queue
+ *
+ * @param entry -
+ * the smart entry
+ */
+ public void add(SmartEntry entry) {
+ /*
+ * make sure we are within a synchronized block since we are dealing
+ * with two unsync collections
+ */
+ synchronized (mutex) {
+ /* check to see if this object has already been queued */
+ SmartEntry current = (SmartEntry) queueMap.get(entry.getKey());
+ if (current == null) {
+ /* the object has not been queued, at it to the end of the queue */
+ if (log.isDebugEnabled())
+ log.debug("[" + Thread.currentThread().getName()
+ + "][SmartQueue] Adding new object=" + entry);
+ queue.addLast(entry);
+ queueMap.put(entry.getKey(), entry);
+ } else {
+ /* the object has been queued, replace the value */
+ if (log.isDebugEnabled())
+ log.debug("[" + Thread.currentThread().getName()
+ + "][SmartQueue] Replacing old object=" + current);
+ current.setValue(entry.getValue());
+ if (log.isDebugEnabled())
+ log.debug("with new object=" + current);
+ }
+ /*
+ * wake up all the threads that are waiting for the lock to be
+ * released
+ */
+ mutex.notifyAll();
+ }
+ }
+
+ public int size() {
+ synchronized (mutex) {
+ return queue.size();
+ }
+ }
+
+ /**
+ * Blocks forever until an element has been added to the queue
+ */
+ public SmartEntry remove() {
+ return remove(0);
+ }
+
+ public SmartEntry remove(long timeout) {
+ SmartEntry result = null;
+ long startEntry = System.currentTimeMillis();
+ synchronized (mutex) {
+ while (size() == 0) {
+ try {
+ if (log.isDebugEnabled())
+ log
+ .debug("["
+ + Thread.currentThread().getName()
+ + "][SmartQueue] Queue sleeping until object added size="
+ + size() + ".");
+ if ((timeout != 0)
+ && ((System.currentTimeMillis() - startEntry) > timeout)) {
+ return null;
+ }
+ mutex.wait(timeout);
+ if (log.isDebugEnabled())
+ log
+ .debug("["
+ + Thread.currentThread().getName()
+ + "][SmartQueue] Queue woke up or interrupted size="
+ + size() + ".");
+ } catch (IllegalMonitorStateException ex) {
+ throw ex;
+ } catch (InterruptedException ex) {
+ }//catch
+ }//while
+ /* guaranteed that we are not empty by now */
+ result = (SmartEntry) queue.removeFirst();
+ queueMap.remove(result.getKey());
+ if (log.isDebugEnabled())
+ log.debug("[" + Thread.currentThread().getName()
+ + "][SmartQueue] Returning=" + result);
+ }
+ return result;
+ }
+
+ public static class SmartEntry {
+ protected Object key;
+
+ protected Object value;
+
+ public SmartEntry(Object key, Object value) {
+ if (key == null)
+ throw new IllegalArgumentException(
+ "SmartEntry key can not be null.");
+ if (value == null)
+ throw new IllegalArgumentException(
+ "SmartEntry value can not be null.");
+ this.key = key;
+ this.value = value;
+ }
+
+ public Object getKey() {
+ return key;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public void setValue(Object value) {
+ if (value == null)
+ throw new IllegalArgumentException(
+ "SmartEntry value can not be null.");
+ this.value = value;
+ }
+
+ public int hashCode() {
+ return key.hashCode();
+ }
+
+ public boolean equals(Object o) {
+ if (!(o instanceof SmartEntry))
+ return false;
+ SmartEntry other = (SmartEntry) o;
+ return other.getKey().equals(getKey());
+ }
+
+ public String toString() {
+ return "[SmartyEntry key=" + key + " value=" + value + "]";
+ }
+ }
+
+}
\ No newline at end of file
Added: tomcat/container/tc5.5.x/modules/ha/build.xml
URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/ha/build.xml?rev=380209&view=auto
==============================================================================
--- tomcat/container/tc5.5.x/modules/ha/build.xml (added)
+++ tomcat/container/tc5.5.x/modules/ha/build.xml Thu Feb 23 11:55:14 2006
@@ -0,0 +1,156 @@
+<project name="Cluster" default="dist" basedir=".">
+
+
+ <!-- ===================== Initialize Property Values =================== -->
+
+ <property file="../../../build.properties" />
+ <property file="../../../build/build.properties" />
+ <property file="../../../build/build.properties.default" />
+
+ <!-- Build Defaults -->
+ <property name="catalina.home" location="../.."/>
+ <property name="catalina.build" location="../../../build/build"/>
+ <property name="ha.build" value="${catalina.home}/modules/ha/build"/>
+ <property name="ha.dist" value="${catalina.home}/modules/ha/dist"/>
+
+ <property name="groupcom.dist" value="${catalina.home}/modules/groupcom/dist"/>
+
+ <!-- Construct Catalina classpath -->
+ <path id="ha.classpath">
+ <pathelement location="${catalina.build}/server/lib/catalina.jar"/>
+ <pathelement location="${catalina.build}/server/lib/tomcat-util.jar"/>
+ <pathelement location="${commons-modeler.jar}"/>
+ <pathelement location="${commons-logging.jar}"/>
+ <pathelement location="${jmx.jar}"/>
+ <pathelement location="${catalina.build}/common/lib/servlet-api.jar"/>
+ </path>
+
+ <!-- Source path -->
+ <path id="javadoc.sourcepath">
+ <pathelement location="src/share"/>
+ </path>
+
+
+ <!-- =================== BUILD: Set compile flags ======================= -->
+ <target name="build-groups">
+ <ant antfile="../groupcom/build.xml" dir="../groupcom/"/>
+ </target>
+
+
+ <!-- =================== BUILD: Set compile flags ======================= -->
+ <target name="flags">
+ <!-- JDK flags -->
+ <available property="jdk.1.2.present" classname="java.util.HashMap" />
+ <available property="jdk.1.3.present" classname="java.lang.reflect.Proxy" />
+ <available property="jdk.1.4.present" classname="java.nio.Buffer" />
+ </target>
+
+
+ <!-- =================== BUILD: Set compile flags ======================= -->
+ <target name="flags.display" depends="flags" unless="flags.hide">
+
+ <echo message="--- Build environment for Catalina ---" />
+
+ <echo message="If ${property_name} is displayed, then the property is not set)" />
+
+ <echo message="--- Build options ---" />
+ <echo message="full.dist=${full.dist}" />
+ <echo message="build.sysclasspath=${build.sysclasspath}" />
+ <echo message="compile.debug=${compile.debug}" />
+ <echo message="compile.deprecation=${compile.deprecation}" />
+ <echo message="compile.optimize=${compile.optimize}" />
+
+ <echo message="--- Ant Flags ---" />
+ <echo message="<style> task available (required)=${style.available}" />
+
+ <echo message="--- JDK ---" />
+ <echo message="jdk.1.2.present=${jdk.1.2.present}" />
+ <echo message="jdk.1.3.present=${jdk.1.3.present}" />
+ <echo message="jdk.1.4.present=${jdk.1.4.present}" />
+
+ </target>
+
+ <!-- =================== BUILD: Create Directories ====================== -->
+ <target name="build-prepare">
+ <mkdir dir="${catalina.build}"/>
+ <mkdir dir="${catalina.build}/classes"/>
+ <mkdir dir="${ha.dist}"/>
+ </target>
+
+
+
+
+ <!-- ================ BUILD: Compile Catalina Components ================ -->
+
+ <target name="build-catalina-ha" depends="build-prepare, build-groups">
+ <!-- Compile internal server components -->
+ <javac srcdir="${basedir}/src/share" destdir="${catalina.build}/classes"
+ debug="${compile.debug}" deprecation="${compile.deprecation}"
+ optimize="${compile.optimize}"
+ excludes="**/CVS/**"
+ >
+ <classpath refid="ha.classpath" />
+ </javac>
+ <copy file="${basedir}/src/share/org/apache/catalina/cluster/LocalStrings.properties"
+ tofile="${catalina.build}/classes/org/apache/catalina/cluster/LocalStrings.properties"/>
+ <copy file="${basedir}/src/share/org/apache/catalina/cluster/session/LocalStrings.properties"
+ tofile="${catalina.build}/classes/org/apache/catalina/cluster/session/LocalStrings.properties"/>
+ <copy file="${basedir}/src/share/org/apache/catalina/cluster/tcp/LocalStrings.properties"
+ tofile="${catalina.build}/classes/org/apache/catalina/cluster/tcp/LocalStrings.properties"/>
+ <copy file="${basedir}/src/share/org/apache/catalina/cluster/session/mbeans-descriptors.xml"
+ tofile="${catalina.build}/classes/org/apache/catalina/cluster/session/mbeans-descriptors.xml"/>
+ <copy file="${basedir}/src/share/org/apache/catalina/cluster/tcp/mbeans-descriptors.xml"
+ tofile="${catalina.build}/classes/org/apache/catalina/cluster/tcp/mbeans-descriptors.xml"/>
+ </target>
+
+
+ <!-- ================ BUILD: Create Catalina Javadocs =================== -->
+ <target name="javadoc">
+ <delete dir="${catalina.build}/javadoc"/>
+ <mkdir dir="${catalina.build}/javadoc"/>
+ <javadoc packagenames="org.apache.catalina.*,org.apache.naming.*"
+ classpathref="catalina.classpath"
+ sourcepathref="javadoc.sourcepath"
+ destdir="${catalina.build}/javadoc"
+ author="true"
+ version="true"
+ windowtitle="Catalina Internal API Documentation"
+ doctitle="Catalina API"
+ bottom="Copyright © 2000-2002 Apache Software Foundation. All Rights Reserved."
+ />
+ </target>
+
+
+ <!-- ======================= BUILD: Clean Directory ===================== -->
+ <target name="build-clean">
+ <delete dir="${catalina.build}"/>
+ </target>
+
+
+ <!-- ==================== BUILD: Rebuild Everything ===================== -->
+
+
+
+
+ <!-- ================ DIST: Create Distribution ========================= -->
+ <target name="dist" depends="build-catalina-ha">
+
+ <jar destfile="${ha.dist}/catalina-cluster.jar"
+ basedir="${catalina.build}/classes">
+ <include name="org/apache/catalina/cluster/**" />
+ <exclude name="**/package.html" />
+ <exclude name="**/LocalStrings_*" />
+ </jar>
+ </target>
+
+ <target name="copy" depends="dist" >
+ <copy file="${ha.dist}/catalina-cluster.jar" todir="${catalina.build}/server/lib" />
+ </target>
+
+ <!-- ======================== DIST: Clean Directory ===================== -->
+
+
+ <!-- ====================== Convenient Synonyms ========================= -->
+
+
+</project>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org