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/07/16 23:02:30 UTC
cvs commit: jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp DataSenders.properties DataSender.java IDataSender.java IDataSenderFactory.java LocalStrings.properties
pero 2005/07/16 14:02:30
Modified: modules/cluster/src/share/org/apache/catalina/cluster/tcp
DataSender.java IDataSender.java
IDataSenderFactory.java LocalStrings.properties
Added: modules/cluster/src/share/org/apache/catalina/cluster/tcp
DataSenders.properties
Log:
Made cluster modes configurable!
Setup your own DataSender at server classpath DataSenders.properties
Revision Changes Path
1.15 +17 -2 jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp/DataSender.java
Index: DataSender.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp/DataSender.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- DataSender.java 8 Jul 2005 20:50:30 -0000 1.14
+++ DataSender.java 16 Jul 2005 21:02:17 -0000 1.15
@@ -211,7 +211,7 @@
// ------------------------------------------------------------- Constructor
-
+
public DataSender(String domain,InetAddress host, int port) {
this.address = host;
this.port = port;
@@ -396,10 +396,25 @@
return dataFailureCounter;
}
+ /**
+ * @param address The address to set.
+ */
+ public void setAddress(InetAddress address) {
+ this.address = address;
+ }
+
public InetAddress getAddress() {
return address;
}
+
+ /**
+ * @param port The port to set.
+ */
+ public void setPort(int port) {
+ this.port = port;
+ }
+
public int getPort() {
return port;
}
1.11 +3 -1 jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp/IDataSender.java
Index: IDataSender.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp/IDataSender.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- IDataSender.java 26 Jun 2005 21:21:50 -0000 1.10
+++ IDataSender.java 16 Jul 2005 21:02:17 -0000 1.11
@@ -18,13 +18,15 @@
/**
* @author Peter Rossbach
- * @version 1.0
+ * @version $Revision$ $Date$
* @since 5.5.7
*/
public interface IDataSender
{
+ public void setAddress(java.net.InetAddress address);
public java.net.InetAddress getAddress();
+ public void setPort(int port);
public int getPort();
public void connect() throws java.io.IOException;
public void disconnect();
1.6 +150 -25 jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp/IDataSenderFactory.java
Index: IDataSenderFactory.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp/IDataSenderFactory.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- IDataSenderFactory.java 9 Jun 2005 20:37:33 -0000 1.5
+++ IDataSenderFactory.java 16 Jul 2005 21:02:17 -0000 1.6
@@ -15,46 +15,171 @@
*/
package org.apache.catalina.cluster.tcp;
-import org.apache.catalina.cluster.Member;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Constructor;
import java.net.InetAddress;
+import java.util.Iterator;
+import java.util.Properties;
+
+import org.apache.catalina.cluster.Member;
+import org.apache.catalina.util.StringManager;
/**
+ * Create DataSender for different modes. DataSender factory load mode list from
+ * <code>org/apache/catalina/cluster/tcp/DataSenders.properties</code> resource.
+ *
* @author Peter Rossbach
- * @version 1.0
+ * @version $Revision$ $Date$
* @since 5.5.7
*/
public class IDataSenderFactory {
+
+ private static org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory
+ .getLog(IDataSenderFactory.class);
+
+ private static final String DATASENDERS_PROPERTIES = "org/apache/catalina/cluster/tcp/DataSenders.properties";
+ public static final String SYNC_MODE = "synchronous";
+ public static final String ASYNC_MODE = "asynchronous";
+ public static final String POOLED_SYNC_MODE = "pooled";
+ public static final String FAST_ASYNC_QUEUE_MODE = "fastasyncqueue";
+
+ /**
+ * The string manager for this package.
+ */
+ protected static StringManager sm = StringManager
+ .getManager(Constants.Package);
+
+ // ----------------------------------------------------- Instance Variables
+
+ /**
+ * The descriptive information about this implementation.
+ */
+ private static final String info = "IDataSenderFactory/2.0";
+
private IDataSenderFactory() {
}
- public static final String SYNC_MODE="synchronous";
- public static final String ASYNC_MODE="asynchronous";
- public static final String POOLED_SYNC_MODE="pooled";
- public static final String FAST_ASYNC_QUEUE_MODE="fastasyncqueue";
-
- public synchronized static IDataSender getIDataSender(String mode, Member mbr)
- throws java.io.IOException {
- if (SYNC_MODE.equals(mode) )
- return new SocketSender(mbr.getDomain(),InetAddress.getByName(mbr.getHost()),mbr.getPort());
- else if ( ASYNC_MODE.equals(mode) )
- return new AsyncSocketSender(mbr.getDomain(),InetAddress.getByName(mbr.getHost()),mbr.getPort());
- else if ( FAST_ASYNC_QUEUE_MODE.equals(mode) )
- return new FastAsyncSocketSender(mbr.getDomain(),InetAddress.getByName(mbr.getHost()),mbr.getPort());
- else if (POOLED_SYNC_MODE.equals(mode) )
- return new PooledSocketSender(mbr.getDomain(),InetAddress.getByName(mbr.getHost()),mbr.getPort());
- else
- throw new java.io.IOException("Invalid replication mode="+mode);
+
+ private Properties senderModes;
+
+ private static IDataSenderFactory factory ;
+
+ static {
+ factory = new IDataSenderFactory();
+ factory.loadSenderModes();
+ }
+
+ // ------------------------------------------------------------- Properties
+
+ /**
+ * Return descriptive information about this implementation and the
+ * corresponding version number, in the format
+ * <code><description>/<version></code>.
+ */
+ public static String getInfo() {
+ return (info);
+ }
+
+ // ------------------------------------------------------------- static
+
+ /**
+ * Create a new DataSender
+ * @param mode replicaton mode
+ * @param mbr sender target
+ * @return new sender object
+ * @throws java.io.IOException
+ */
+ public synchronized static IDataSender getIDataSender(String mode,
+ Member mbr) throws java.io.IOException {
+ // Identify the class name of the DataSender we should configure
+ IDataSender sender = factory.getSender(mode,mbr);
+ if(sender == null)
+ throw new java.io.IOException("Invalid replication mode=" + mode);
+ return sender ;
}
+ /**
+ * Check that mode is valid
+ * @param mode
+ * @return
+ */
public static String validateMode(String mode) {
- if (SYNC_MODE.equals(mode) ||
- ASYNC_MODE.equals(mode) ||
- FAST_ASYNC_QUEUE_MODE.equals(mode) ||
- POOLED_SYNC_MODE.equals(mode) ) {
- return null;
+ if(factory.isSenderMode(mode))
+ return null ;
+ else {
+ StringBuffer buffer = new StringBuffer("Replication mode has to be '");
+ for (Iterator iter = factory.senderModes.keySet().iterator(); iter.hasNext();) {
+ String key = (String) iter.next();
+ buffer.append(key);
+ if(iter.hasNext())
+ buffer.append("', '");
+ }
+ return buffer.toString();
+ }
+ }
+
+ // ------------------------------------------------------------- private
+
+ private boolean isSenderMode(String mode){
+ return senderModes != null && senderModes.containsKey(mode) ;
+ }
+
+ private IDataSender getSender(String mode,Member mbr) {
+ IDataSender sender = null;
+ String senderName = null;
+ senderName = senderModes.getProperty(mode);
+ if (senderName != null) {
+
+ // Instantiate and install a data replication sender of the requested class
+ try {
+ Class senderClass = Class.forName(senderName);
+ Class paramTypes[] = new Class[3];
+ paramTypes[0] = Class.forName("java.lang.String");
+ paramTypes[1] = Class.forName("java.net.InetAddress");
+ paramTypes[2] = Integer.TYPE ;
+ Constructor constructor = senderClass.getConstructor(paramTypes);
+ if (constructor != null) {
+ Object paramValues[] = new Object[3];
+ paramValues[0] = mbr.getDomain();
+ paramValues[1] = InetAddress.getByName(mbr.getHost());
+ paramValues[2] = new Integer(mbr.getPort());
+ sender = (IDataSender) constructor.newInstance(paramValues);
+ } else {
+ log.error(sm.getString("IDataSender.senderModes.Instantiate",
+ senderName));
+ }
+ } catch (Throwable t) {
+ log.error(sm.getString("IDataSender.senderModes.Instantiate",
+ senderName), t);
+ }
} else {
- return "Replication mode has to be '"+SYNC_MODE+"', '" + FAST_ASYNC_QUEUE_MODE +"', '"+ASYNC_MODE+"' or '"+POOLED_SYNC_MODE+"'";
+ log.error(sm.getString("IDataSender.senderModes.Missing", mode));
}
+ return sender;
}
+ private synchronized void loadSenderModes() {
+ // Load our mapping properties if necessary
+ if (senderModes == null) {
+ try {
+ InputStream is = IDataSender.class
+ .getClassLoader()
+ .getResourceAsStream(
+ DATASENDERS_PROPERTIES);
+ if (is != null) {
+ senderModes = new Properties();
+ senderModes.load(is);
+ } else {
+ log.error(sm.getString("IDataSender.senderModes.Resources"));
+ return;
+ }
+ } catch (IOException e) {
+ log.error(sm.getString("IDataSender.senderModes.Resources"), e);
+ return;
+ }
+ }
+
+ }
}
1.15 +4 -0 jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp/LocalStrings.properties
Index: LocalStrings.properties
===================================================================
RCS file: /home/cvs/jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp/LocalStrings.properties,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- LocalStrings.properties 8 Jul 2005 20:50:30 -0000 1.14
+++ LocalStrings.properties 16 Jul 2005 21:02:17 -0000 1.15
@@ -22,6 +22,10 @@
IDataSender.send.crash=Send message crashed [{0}:{1,number,integer}] type=[{2}], id=[{3}]
IDataSender.send.message=Send message to [{0}:{1,number,integer}] id=[{2}] size={3,number,integer}
IDataSender.send.lost=Send message don't send [{0}:{1,number,integer}] type=[{2}], id=[{3}]
+IDataSender.senderModes.Configured=Configured a data replication sender for mode {0}
+IDataSender.senderModes.Instantiate=Cannot instantiate a data replication sender of class {0}
+IDataSender.senderModes.Missing=Cannot configure a data replication sender for mode {0}
+IDataSender.senderModes.Resources=Cannot load data replication sender mapping list
IDataSender.stats=Send stats from [{0}:{1,number,integer}] Nr of bytes sent={2,number,integer} over {3} = {4,number,integer} bytes/request, processing time {5,number,integer} msec, avg processing time {6,number,integer} msec
PoolSocketSender.senderQueue.sender.failed=PoolSocketSender create new sender to [{0}:{1,number,integer}] failed
PoolSocketSender.noMoreSender=No socket sender available for client [{0}:{1,number,integer}] did it disappear?
1.1 jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/tcp/DataSenders.properties
Index: DataSenders.properties
===================================================================
fastasyncqueue=org.apache.catalina.cluster.tcp.FastAsyncSocketSender
asynchronous=org.apache.catalina..cluster.tcp.AsyncSocketSender
synchronous=org.apache.catalina..cluster.tcp.SocketSender
pooled=org.apache.catalina.cluster.tcp.PooledSocketSender
---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org