/******************************************************************************* * Copyright (c) 2011 EclipseSource and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * EclipseSource - initial API and implementation ******************************************************************************/ package org.eclipse.rap.rwt.cluster.testfixture.internal.tomcat; import org.apache.catalina.Engine; import org.apache.catalina.ha.session.ClusterSessionListener; import org.apache.catalina.ha.session.DeltaManager; import org.apache.catalina.ha.session.JvmRouteBinderValve; import org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener; import org.apache.catalina.ha.tcp.ReplicationValve; import org.apache.catalina.ha.tcp.SimpleTcpCluster; import org.apache.catalina.tribes.Channel; import org.apache.catalina.tribes.group.GroupChannel; import org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor; import org.apache.catalina.tribes.group.interceptors.TcpFailureDetector; import org.apache.catalina.tribes.transport.ReplicationTransmitter; import org.apache.catalina.tribes.transport.nio.NioReceiver; import org.apache.catalina.tribes.transport.nio.PooledParallelSender; import org.eclipse.rap.rwt.cluster.testfixture.internal.util.SocketUtil; // configure() was sadapted from the XML snippet below: // <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> // <Manager className="org.apache.catalina.ha.session.DeltaManager" // expireSessionsOnShutdown="false" // notifyListenersOnReplication="true" /> // <Channel className="org.apache.catalina.tribes.group.GroupChannel"> // <Membership className="org.apache.catalina.tribes.membership.McastService" // address="228.0.0.4" port="45564" frequency="500" dropTime="3000" /> // <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" // address="auto" port="4000" autoBind="100" selectorTimeout="5000" // maxThreads="6" /> // <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> // <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" /> // </Sender> // <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" /> // <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor" /> // </Channel> // <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="" /> // <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve" /> // <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" /> // <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" /> // </Cluster> class ClusterConfigurer { private static final String LOCALHOST = "127.0.0.1"; private static final int CHANNEL_SEND_OPTIONS = Channel.SEND_OPTIONS_DEFAULT | Channel.SEND_OPTIONS_SYNCHRONIZED_ACK; private final Engine engine; ClusterConfigurer( Engine engine ) { this.engine = engine; } void configure() { SimpleTcpCluster cluster = new SimpleTcpCluster(); GroupChannel channel = new GroupChannel(); cluster.setChannel( channel ); configureCluster( cluster ); configureChannel( channel ); engine.setCluster( cluster ); } private void configureChannel( GroupChannel channel ) { channel.setChannelReceiver( createChannelReceiver() ); channel.setChannelSender( createChannelSender() ); channel.addInterceptor( new TcpFailureDetector() ); channel.addInterceptor( new MessageDispatch15Interceptor() ); } private void configureCluster( SimpleTcpCluster cluster ) { cluster.setManagerTemplate( createDeltaManager() ); cluster.setChannelSendOptions( CHANNEL_SEND_OPTIONS ); cluster.addValve( new ReplicationValve() ); cluster.addValve( new JvmRouteBinderValve() ); cluster.addClusterListener( new JvmRouteSessionIDBinderListener() ); cluster.addClusterListener( new ClusterSessionListener() ); } private DeltaManager createDeltaManager() { DeltaManager result = new DeltaManager(); result.setDistributable( true ); result.setExpireSessionsOnShutdown( false ); result.setNotifySessionListenersOnReplication( true ); return result; } private NioReceiver createChannelReceiver() { NioReceiver result = new NioReceiver(); result.setAddress( LOCALHOST ); result.setPort( SocketUtil.getFreePort() ); result.setAutoBind( -1 ); result.setSelectorTimeout( 5000 ); result.setMinThreads( 1 ); return result; } private ReplicationTransmitter createChannelSender() { ReplicationTransmitter result = new ReplicationTransmitter(); result.setTransport( new PooledParallelSender() ); return result; } }