Hi,

we are using tomcat 6.0.39 on linux machines.
I've implemented a clustering via tribes for exchanging messages with
static membership. We are not using mutlicast as it does not work with
linux vserver. We are not using session replication. We just want to
exchange some commands.
Everything works fine, except that the cluster is not informed if a
member from a different machine is shut down.

For example:
I have member1 and member2 on one machine with ip 192.168.0.88 and
member3 and member4 on an other machine with ip 192.168.0.89
If i shutdown member4, member3 calls the memberDisappeared() method of
my membershiplistener.
But this method is not called by the members member1 and member2.
member1 and member2 are still referencing the dead member4, if i call
channel.getmembers()

This is my code for setting up the cluster:

final StandardEngine engine = (StandardEngine)
ServerFactory.getServer().findService(CATALINA_SERVICE).getContainer();

final Container hostContainer = getHostContainer(engine);

_simpleTcpCluster = new SimpleTcpCluster();
_simpleTcpCluster.setProperty("channelStartOptions", 3);    //disable
multicast
_simpleTcpCluster.setProperty("channelSendOptions", 8);    // ???

final TcpFailureDetector tcpFailureDetector = new TcpFailureDetector();

final MyMessageDispatch15Interceptor messageDispatchInterceptor = new
MyMessageDispatch15Interceptor();
final MyChannelReceiver myChannelReceiver = new
MyChannelReceiver(mysc.getClusterListenAddress());
myChannelReceiver.setPort(_clusterPort);

final StaticMembershipInterceptor staticMembershipInterceptor = new
StaticMembershipInterceptor();
final  Tuple2<Integer,List<StaticMember>> members = getMembers();
for(final Member member : members.getB()){
    if (member.isReady()) {
        LOGGER.info("[" + mysc.getStoreGroupId() + "-app] adding static
member: " + MyMembershipListener.getMemberId(member));
        staticMembershipInterceptor.addStaticMember(member);
    } else {
        LOGGER.info("[" + mysc.getStoreGroupId() + "-app] static member
not ready: " + MyMembershipListener.getMemberId(member) + ", not
added");  //this is never called
    }
}
tcpFailureDetector.setNext(staticMembershipInterceptor);
staticMembershipInterceptor.setPrevious(tcpFailureDetector);
staticMembershipInterceptor.setNext(messageDispatchInterceptor);
messageDispatchInterceptor.setPrevious(staticMembershipInterceptor);
_myMembershipService = new MyMembershipService(members.getA());
//       
myMembershipService.setMcastBindAddress(mysc.getClusterListenAddress());   
//forces an error

_clusterChannel = new MyGroupChannel();
_clusterChannel.setMembershipService(_myMembershipService);
_clusterChannel.setChannelReceiver(myChannelReceiver);
_clusterChannel.addInterceptor(tcpFailureDetector);
_clusterChannel.addInterceptor(staticMembershipInterceptor);
_clusterChannel.addInterceptor(messageDispatchInterceptor);
_clusterChannel.addMembershipListener(_mbrListener);
_clusterChannel.addChannelListener(_msgListener);

_simpleTcpCluster.setChannel(_clusterChannel);
hostContainer.setCluster(_simpleTcpCluster);

try {
    _clusterChannel.start(Channel.DEFAULT);
} catch (ChannelException e) {
    e.printStackTrace();
}

final Member[] group = _clusterChannel.getMembers();
if(group.length < 1){
    LOGGER.info("[" + mysc.getStoreGroupId() + "-app] did not find any
other cluster-members");           
} else {
    LOGGER.info("[" + mysc.getStoreGroupId() + "-app] found the
following cluster-members:");
    for(final Member m : group){
        LOGGER.info("[" + mysc.getStoreGroupId() + "-app] name: " +
m.getName() + ", port: " + m.getPort() + ", uniqueid: " +
MyMembershipListener.getMemberId(m));
    }
}

Any help is welcome.


With kind regards
Dave






Reply via email to