public SimpleTomEETcpCluster(final SimpleTcpCluster from) { clusterListeners.addAll(Arrays.asList(from.findClusterListeners())); setClusterName(from.getClusterName()); setContainer(from.getContainer()); setNotifyLifecycleListenerOnFailure(from.isNotifyLifecycleListenerOnFailure()); setChannelSendOptions(from.getChannelSendOptions()); setChannelStartOptions(from.getChannelStartOptions()); setHeartbeatBackgroundEnabled(from.isHeartbeatBackgroundEnabled()); setChannel(from.getChannel()); getManagers().putAll(from.getManagers()); setManagerTemplate(from.getManagerTemplate()); setClusterDeployer(from.getClusterDeployer()); for (final Valve valve : from.getValves()) { addValve(valve); } }
/** * Remove an application from cluster replication bus. * * @see org.apache.catalina.Cluster#removeManager(Manager) */ @Override public void removeManager(Manager manager) { if (manager != null && manager instanceof ClusterManager ) { ClusterManager cmgr = (ClusterManager) manager; // Notify our interested LifecycleListeners fireLifecycleEvent(BEFORE_MANAGERUNREGISTER_EVENT,manager); managers.remove(getManagerName(cmgr.getName(),manager)); cmgr.setCluster(null); // Notify our interested LifecycleListeners fireLifecycleEvent(AFTER_MANAGERUNREGISTER_EVENT, manager); } }
@SuppressWarnings("deprecation") @Override protected void initInternal() throws LifecycleException { super.initInternal(); if (clusterDeployer != null) { StringBuilder name = new StringBuilder("type=Cluster"); Container container = getContainer(); name.append(MBeanUtils.getContainerKeyProperties(container)); name.append(",component=Deployer"); onameClusterDeployer = register(clusterDeployer, name.toString()); } }
/** * Start Cluster and implement the requirements * of {@link org.apache.catalina.util.LifecycleBase#startInternal()}. * * @exception LifecycleException if this component detects a fatal error * that prevents this component from being used */ @Override protected void startInternal() throws LifecycleException { if (log.isInfoEnabled()) log.info("Cluster is about to start"); try { checkDefaults(); registerClusterValve(); channel.addMembershipListener(this); channel.addChannelListener(this); channel.start(channelStartOptions); if (clusterDeployer != null) clusterDeployer.start(); registerMember(channel.getLocalMember(false)); } catch (Exception x) { log.error("Unable to start cluster.", x); throw new LifecycleException(x); } setState(LifecycleState.STARTING); }
@SuppressWarnings("deprecation") @Override protected String getDomainInternal() { Container container = getContainer(); if (container == null) { return null; } return MBeanUtils.getDomain(container); }
private Property prepareTomcatClustering(Host host, Property engineConfig) throws ContainerException { Property clusterProp = null; List<Property> clusterProps = engineConfig.getPropertiesWithValue("cluster"); if (clusterProps.size() > 1) { throw new ContainerException("Only one cluster configuration allowed per engine"); } if (UtilValidate.isNotEmpty(clusterProps)) { clusterProp = clusterProps.get(0); GroupChannel channel = new GroupChannel(); channel.setChannelReceiver(prepareChannelReceiver(clusterProp)); channel.setChannelSender(prepareChannelSender(clusterProp)); channel.setMembershipService(prepareChannelMcastService(clusterProp)); SimpleTcpCluster cluster = new SimpleTcpCluster(); cluster.setClusterName(clusterProp.name); cluster.setManagerTemplate(prepareClusterManager(clusterProp)); cluster.setChannel(channel); cluster.addValve(prepareClusterValve(clusterProp)); host.setCluster(cluster); Debug.logInfo("Catalina Cluster [" + cluster.getClusterName() + "] configured for host - " + host.getName(), module); } return clusterProp; }
protected void checkDefaults() { if ( clusterListeners.size() == 0 ) { addClusterListener(new ClusterSessionListener()); } if ( valves.size() == 0 ) { addValve(new JvmRouteBinderValve()); addValve(new ReplicationValve()); } if ( clusterDeployer != null ) clusterDeployer.setCluster(this); if ( channel == null ) channel = new GroupChannel(); if ( channel instanceof GroupChannel && !((GroupChannel)channel).getInterceptors().hasNext()) { channel.addInterceptor(new MessageDispatch15Interceptor()); channel.addInterceptor(new TcpFailureDetector()); } }
/** * New cluster member is registered * * @see org.apache.catalina.tribes.MembershipListener#memberAdded(org.apache.catalina.tribes.Member) */ @Override public void memberAdded(Member member) { try { hasMembers = channel.hasMembers(); if (log.isInfoEnabled()) log.info("Replication member added:" + member); // Notify our interested LifecycleListeners fireLifecycleEvent(BEFORE_MEMBERREGISTER_EVENT, member); registerMember(member); // Notify our interested LifecycleListeners fireLifecycleEvent(AFTER_MEMBERREGISTER_EVENT, member); } catch (Exception x) { log.error("Unable to connect to replication system.", x); } }
/** * Cluster member is gone * * @see org.apache.catalina.tribes.MembershipListener#memberDisappeared(org.apache.catalina.tribes.Member) */ @Override public void memberDisappeared(Member member) { try { hasMembers = channel.hasMembers(); if (log.isInfoEnabled()) log.info("Received member disappeared:" + member); // Notify our interested LifecycleListeners fireLifecycleEvent(BEFORE_MEMBERUNREGISTER_EVENT, member); unregisterMember(member); // Notify our interested LifecycleListeners fireLifecycleEvent(AFTER_MEMBERUNREGISTER_EVENT, member); } catch (Exception x) { log.error("Unable remove cluster node from replication system.", x); } }
/** * Execute a periodic task, such as reloading, etc. This method will be * invoked inside the classloading context of this container. Unexpected * throwables will be caught and logged. * @see org.apache.catalina.ha.deploy.FarmWarDeployer#backgroundProcess() * @see org.apache.catalina.tribes.group.GroupChannel#heartbeat() * */ @Override public void backgroundProcess() { if (clusterDeployer != null) clusterDeployer.backgroundProcess(); //send a heartbeat through the channel if ( isHeartbeatBackgroundEnabled() && channel !=null ) channel.heartbeat(); // periodic event fireLifecycleEvent(Lifecycle.PERIODIC_EVENT, null); }
SimpleTcpCluster tcpCluster = (SimpleTcpCluster) cluster; ClusterManager manager = tcpCluster.getManagerTemplate(); if (manager != null) { storeElement(aWriter, indent, manager); LifecycleListener listeners[] = ((SimpleTcpCluster)cluster).findLifecycleListeners(); storeElementArray(aWriter, indent, listeners); ClusterListener mlisteners[] = ((SimpleTcpCluster)cluster).findClusterListeners(); List<ClusterListener> clusterListeners = new ArrayList<>(); for (ClusterListener clusterListener : mlisteners) {
/** * Create new Manager without add to cluster (comes with start the manager) * * @param name * Context Name of this manager * @see org.apache.catalina.Cluster#createManager(java.lang.String) * @see DeltaManager#start() */ @Override public synchronized Manager createManager(String name) { if (log.isDebugEnabled()) { log.debug("Creating ClusterManager for context " + name + " using class " + getManagerTemplate().getClass().getName()); } Manager manager = null; try { manager = managerTemplate.cloneFromTemplate(); ((ClusterManager)manager).setName(name); } catch (Exception x) { log.error("Unable to clone cluster manager, defaulting to org.apache.catalina.ha.session.DeltaManager", x); manager = new org.apache.catalina.ha.session.DeltaManager(); } finally { if ( manager != null && (manager instanceof ClusterManager)) ((ClusterManager)manager).setCluster(this); } return manager; }
@Override public void send(ClusterMessage msg, Member dest, int sendOptions) { try { msg.setAddress(getLocalMember()); if (dest != null) { if (!getLocalMember().equals(dest)) { channel.send(new Member[] {dest}, msg, sendOptions); } else log.error(sm.getString("simpleTcpCluster.unableSend.localMember", msg)); } else { Member[] destmembers = channel.getMembers(); if (destmembers.length>0) channel.send(destmembers,msg, sendOptions); else if (log.isDebugEnabled()) log.debug("No members in cluster, ignoring message:"+msg); } } catch (Exception x) { log.error(sm.getString("simpleTcpCluster.sendFailed"), x); } }
Member dest = message.getAddress(); fireLifecycleEvent(RECEIVE_MESSAGE_FAILURE_EVENT, new SendMessageData(message, dest, null)); if (log.isDebugEnabled()) {
/** * Execute a periodic task, such as reloading, etc. This method will be * invoked inside the classloading context of this container. Unexpected * throwables will be caught and logged. * @see org.apache.catalina.ha.deploy.FarmWarDeployer#backgroundProcess() * @see org.apache.catalina.tribes.group.GroupChannel#heartbeat() * @see org.apache.catalina.tribes.group.GroupChannel.HeartbeatThread#run() * */ @Override public void backgroundProcess() { if (clusterDeployer != null) clusterDeployer.backgroundProcess(); //send a heartbeat through the channel if ( isHeartbeatBackgroundEnabled() && channel !=null ) channel.heartbeat(); }
@Override protected void checkDefaults() { final List<ClusterListener> currentListeners = clusterListeners; final TomEEClusterListener tomEEClusterListener = SystemInstance.get().getComponent(TomEEClusterListener.class); if (currentListeners.size() == 1 && currentListeners.iterator().next() == tomEEClusterListener) { currentListeners.clear(); } // else force the new cluster listener for (final ClusterListener clusterListener : currentListeners) { clusterListener.setCluster(this); // we don't care about TomEEClusterListener since it is stateless } if (getClusterDeployer() != null) { getClusterDeployer().setCluster(this); } super.checkDefaults(); addClusterListener(tomEEClusterListener); // since that's a singleton and all listeners have to be unique (contains()) we can always add it } }
/** * Start Cluster and implement the requirements * of {@link org.apache.catalina.util.LifecycleBase#startInternal()}. * * @exception LifecycleException if this component detects a fatal error * that prevents this component from being used */ @Override protected void startInternal() throws LifecycleException { if (log.isInfoEnabled()) log.info("Cluster is about to start"); try { checkDefaults(); registerClusterValve(); channel.addMembershipListener(this); channel.addChannelListener(this); channel.start(channelStartOptions); if (clusterDeployer != null) clusterDeployer.start(); registerMember(channel.getLocalMember(false)); } catch (Exception x) { log.error("Unable to start cluster.", x); throw new LifecycleException(x); } setState(LifecycleState.STARTING); }
@Override protected void initInternal() throws LifecycleException { super.initInternal(); if (clusterDeployer != null) { StringBuilder name = new StringBuilder("type=Cluster"); Container container = getContainer(); if (container != null) { name.append(container.getMBeanKeyProperties()); } name.append(",component=Deployer"); onameClusterDeployer = register(clusterDeployer, name.toString()); } }
@Override protected String getDomainInternal() { Container container = getContainer(); if (container == null) { return null; } return container.getDomain(); }
protected void checkDefaults() { if ( clusterListeners.size() == 0 ) { addClusterListener(new JvmRouteSessionIDBinderListener()); addClusterListener(new ClusterSessionListener()); } if ( valves.size() == 0 ) { addValve(new JvmRouteBinderValve()); addValve(new ReplicationValve()); } if ( clusterDeployer != null ) clusterDeployer.setCluster(this); if ( channel == null ) channel = new GroupChannel(); if ( channel instanceof GroupChannel && !((GroupChannel)channel).getInterceptors().hasNext()) { channel.addInterceptor(new MessageDispatch15Interceptor()); channel.addInterceptor(new TcpFailureDetector()); } }