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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]