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>&lt;description&gt;/&lt;version&gt;</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