tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Raul Benito <r...@r-bg.com>
Subject [PATCH] Clustering members using UDP sockets instead of multicast ones
Date Mon, 26 Jan 2004 19:24:33 GMT
Hi,
I'm testing the tomcat5 cluster in an environment where multicast 
connections are filtered. So in order to test our implementation in a 
cluster tomcat, i created this little UdpService that is heavily based 
in McastService, but the cluster nodes are specified in an attribute as 
comma delimited instead of been discover. It is not intended to be a 
fast, it is only for testing. Perhaps somebody wants for something, and 
keep doing this great work.

Regards,

Index: McastServiceImpl.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/mcast/McastServiceImpl.java,v
retrieving revision 1.6
diff -u -r1.6 McastServiceImpl.java
--- McastServiceImpl.java       13 Jan 2004 00:07:18 -0000      1.6
+++ McastServiceImpl.java       26 Jan 2004 19:14:41 -0000
@@ -143,6 +143,11 @@
     protected long serviceStartTime = System.currentTimeMillis();
 
     /**
+     * void to do inheritance
+     **/
+    protected McastServiceImpl() {}
+
+    /**
      * Create a new mcast service impl
      * @param member - the local member
      * @param sendFrequency - the time (ms) in between pings sent out



------------------------------------------------------
New file 
jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/mcast/UdpServiceImpl.java

package org.apache.catalina.cluster.mcast;

import java.net.DatagramSocket;
import java.io.IOException;
import java.net.InetAddress ;
import java.net.DatagramPacket;
import org.apache.catalina.cluster.MembershipListener;
public class UdpServiceImpl extends McastServiceImpl
{
    private static org.apache.commons.logging.Log log =
        org.apache.commons.logging.LogFactory.getLog( UdpService.class );
                                                                                

    /**
     * Socket that we intend to listen to
     */
    protected DatagramSocket socket;
                                                                                

    /**
     * The multicast address
     */
    protected InetAddress[] address;
    /**
     * The multicast port
     */
    protected int[] port;
                                                                                

    /**
     * Create a new mcast service impl
     * @param member - the local member
     * @param sendFrequency - the time (ms) in between pings sent out
     * @param expireTime - the time (ms) for a member to expire
     * @param port - the mcast port
     * @param bind - the bind address (not sure this is used yet)
     * @param mcastAddress - the mcast address
     * @param service - the callback service
     * @throws IOException
     */
    public UdpServiceImpl(
        McastMember member,
        long sendFrequency,
        long expireTime,
        int port,
        int[] ports,
        InetAddress bind,
        InetAddress[] mcastAddress,
        MembershipListener service)
    throws IOException {
        System.out.println("HOLA0");
                                                                                

        if ( bind != null) socket = new DatagramSocket(new 
java.net.InetSocketAddress(bind,port));
        else socket = new DatagramSocket(port);
        this.member = member;
        address = mcastAddress;
        this.port = ports;
        receivePacket = new DatagramPacket(new byte[1000],1000);
        //receivePacket.setAddress(address);
        receivePacket.setPort(port);
        membership = new McastMembership(member.getName());
        timeToExpiration = expireTime;
        this.service = service;
        this.sendFrequency = sendFrequency;
    }
                                                                                
                                                                               
                                                                               

    /**
     * Send a ping
     * @throws Exception
     */
    public void send() throws Exception{
        member.inc();
        byte[] data = member.getData(this.serviceStartTime);
        for (int i=0;i<address.length;i++) {
            DatagramPacket p = new DatagramPacket(data,data.length);
            p.setAddress(address[i]);
            p.setPort(port[i]);
            socket.send(p);
        }
    }
                                                                                

}
--------------------------------------------------------------------------
New file 
jakarta-tomcat-catalina/modules/cluster/src/share/org/apache/catalina/cluster/mcast/UdpService.java

package org.apache.catalina.cluster.mcast;
 
import org.apache.catalina.cluster.MembershipService;
import java.util.Properties;
import org.apache.catalina.cluster.Member;
import org.apache.catalina.cluster.MembershipListener;
import java.util.Properties;
 
public class UdpService extends McastService {
                                                                                

    private static org.apache.commons.logging.Log log =
        org.apache.commons.logging.LogFactory.getLog( UdpService.class );
                                                                                

                                                                                

    /**
     * Start broadcasting and listening to membership pings
     * @throws java.lang.Exception if a IO error occurs
     */
    public void start() throws java.lang.Exception {
        if ( impl != null ) return;
        String host = getProperties().getProperty("tcpListenHost");
        int port = 
Integer.parseInt(getProperties().getProperty("tcpListenPort"));
        String name = "tcp://"+host+":"+port;
        localMember = new McastMember(name,host,port,100);
        java.net.InetAddress bind = null;
        if ( properties.getProperty("mcastBindAddress")!= null ) {
            bind = 
java.net.InetAddress.getByName(properties.getProperty("mcastBindAddress"));
        }
                                                                                

        String listAdr=properties.getProperty("mcastAddress");
        String[] addrs=listAdr.split(",");
        java.net.InetAddress[] addr= new java.net.InetAddress[addrs.length];
        int[] ports=new int[addrs.length];
        for (int i=0;i<addrs.length;i++) {
            ports[i]=Integer.parseInt(addrs[i].split(":")[1]);
            addr[i]=java.net.InetAddress.getByName(addrs[i].split(":")[0]);
                                                                                

        }
                                                                                

        impl = new UdpServiceImpl((McastMember)localMember,
                                    
Long.parseLong(properties.getProperty("msgFrequency")),
                                    
Long.parseLong(properties.getProperty("memberDropTime")),
                                    port,
                                    ports,
                                    bind,
                                    addr,
                                    this);
                                                                                

        impl.start();
    }
                                                                                

    /**
     * Simple test program
     * @param args
     * @throws Exception
     */
    public static void main(String args[]) throws Exception {
        System.out.println("Usage McastService hostname tcpport");
        UdpService service = new UdpService();
        java.util.Properties p = new java.util.Properties();
        p.setProperty("mcastPort","5555");
        
p.setProperty("mcastAddress","127.0.0.1:4000,127.0.0.1:40001,127.0.0.1:40002");
        p.setProperty("bindAddress","localhost");
        p.setProperty("memberDropTime","3000");
        p.setProperty("msgFrequency","500");
        p.setProperty("tcpListenPort",args[1]);
        p.setProperty("tcpListenHost",args[0]);
        service.setProperties(p);
        service.start();
        Thread.currentThread().sleep(60*1000*60);
    }
}
------------------------------------------------------------


---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org


Mime
View raw message