113 lines
4.3 KiB
Java
113 lines
4.3 KiB
Java
package com.dbnt.faisp.config.tomcat;
|
|
|
|
import org.apache.catalina.Context;
|
|
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.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.MessageDispatchInterceptor;
|
|
import org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor;
|
|
import org.apache.catalina.tribes.group.interceptors.TcpFailureDetector;
|
|
import org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor;
|
|
import org.apache.catalina.tribes.membership.McastService;
|
|
import org.apache.catalina.tribes.membership.StaticMember;
|
|
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.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
@Component
|
|
public class TomcatClusterContextCustomizer implements TomcatContextCustomizer {
|
|
|
|
@Value("${tomcat.cluster.static-member-host:}")
|
|
private String staticMemberHost;
|
|
@Value("${tomcat.cluster.static-member-port:}")
|
|
private Integer staticMemberPort;
|
|
@Value("${tomcat.cluster.static-member-unique-id:}")
|
|
private String staticMemberUniqueId;
|
|
@Value("${tomcat.cluster.receiver-address:}")
|
|
private String receiverAddress;
|
|
@Value("${tomcat.cluster.receiver-port:}")
|
|
private Integer receiverPort;
|
|
|
|
@Override
|
|
public void customize( final Context context ) {
|
|
context.setDistributable(true);
|
|
|
|
DeltaManager manager = new DeltaManager();
|
|
manager.setExpireSessionsOnShutdown(false);
|
|
manager.setNotifyListenersOnReplication(true);
|
|
context.setManager(manager);
|
|
configureCluster( (Engine)context.getParent().getParent() );
|
|
}
|
|
|
|
private void configureCluster(Engine engine) {
|
|
//cluster setting
|
|
SimpleTcpCluster cluster = new SimpleTcpCluster();
|
|
cluster.setChannelStartOptions(Channel.SND_RX_SEQ|Channel.SND_TX_SEQ);
|
|
cluster.setChannelSendOptions(Channel.SEND_OPTIONS_ASYNCHRONOUS);
|
|
|
|
//channel setting
|
|
GroupChannel channel = new GroupChannel();
|
|
|
|
StaticMembershipInterceptor interceptor = new StaticMembershipInterceptor();
|
|
// 대상 정보
|
|
StaticMember staticMember = new StaticMember();
|
|
staticMember.setPort(staticMemberPort);
|
|
staticMember.setSecurePort(-1);
|
|
staticMember.setHost(staticMemberHost);
|
|
staticMember.setUniqueId(staticMemberUniqueId);
|
|
interceptor.addStaticMember(staticMember);
|
|
|
|
//receiver(현재 자신의 정보)
|
|
NioReceiver receiver = new NioReceiver();
|
|
receiver.setAddress(receiverAddress);
|
|
receiver.setMaxThreads(6);
|
|
receiver.setPort(receiverPort);
|
|
channel.setChannelReceiver(receiver);
|
|
|
|
channel.addInterceptor(interceptor);
|
|
|
|
/* cluster.setChannelSendOptions(6);
|
|
|
|
//channel
|
|
GroupChannel channel = new GroupChannel();
|
|
//membership setting
|
|
McastService mcastService = new McastService();
|
|
mcastService.setAddress("228.0.0.4");
|
|
mcastService.setPort(45564); // TCP&UDP port 오픈 필요
|
|
mcastService.setFrequency(500);
|
|
mcastService.setDropTime(3000);
|
|
channel.setMembershipService(mcastService);
|
|
|
|
//receiver
|
|
NioReceiver receiver = new NioReceiver();
|
|
receiver.setAddress("auto");
|
|
receiver.setMaxThreads(6);
|
|
receiver.setPort(5000); // TCP port 오픈 필요
|
|
channel.setChannelReceiver(receiver);
|
|
*/
|
|
|
|
//sender
|
|
ReplicationTransmitter sender = new ReplicationTransmitter();
|
|
sender.setTransport(new PooledParallelSender());
|
|
channel.setChannelSender(sender);
|
|
|
|
//interceptor
|
|
channel.addInterceptor(new TcpPingInterceptor());
|
|
channel.addInterceptor(new TcpFailureDetector());
|
|
channel.addInterceptor(new MessageDispatchInterceptor());
|
|
cluster.addValve(new ReplicationValve());
|
|
cluster.addValve(new JvmRouteBinderValve());
|
|
cluster.setChannel(channel);
|
|
cluster.addClusterListener(new ClusterSessionListener());
|
|
engine.setCluster(cluster);
|
|
}
|
|
}
|