📄 simpletcpcluster.java
字号:
* remove message listener and deregister Cluster from listener * * @see org.apache.catalina.ha.CatalinaCluster#removeClusterListener(org.apache.catalina.ha.MessageListener) */ public void removeClusterListener(ClusterListener listener) { if (listener != null) { clusterListeners.remove(listener); listener.setCluster(null); } } /** * get current Deployer */ public org.apache.catalina.ha.ClusterDeployer getClusterDeployer() { return clusterDeployer; } /** * set a new Deployer, must be set before cluster started! */ public void setClusterDeployer( org.apache.catalina.ha.ClusterDeployer clusterDeployer) { this.clusterDeployer = clusterDeployer; } public void setChannel(Channel channel) { this.channel = channel; } /** * has members */ public boolean hasMembers() { return channel.hasMembers(); } /** * Get all current cluster members * @return all members or empty array */ public Member[] getMembers() { return channel.getMembers(); } /** * Return the member that represents this node. * * @return Member */ public Member getLocalMember() { return channel.getLocalMember(true); } // ------------------------------------------------------------- dynamic // manager property handling /** * JMX hack to direct use at jconsole * * @param name * @param value */ public void setProperty(String name, String value) { setProperty(name, (Object) value); } /** * set config attributes with reflect and propagate to all managers * * @param name * @param value */ public void setProperty(String name, Object value) { if (log.isTraceEnabled()) log.trace(sm.getString("SimpleTcpCluster.setProperty", name, value, properties.get(name))); properties.put(name, value); if(started) { // FIXME Hmm, is that correct when some DeltaManagers are direct configured inside Context? // Why we not support it for other elements, like sender, receiver or membership? // Must we restart element after change? if (name.startsWith("manager")) { String key = name.substring("manager".length() + 1); String pvalue = value.toString(); for (Iterator iter = managers.values().iterator(); iter.hasNext();) { Manager manager = (Manager) iter.next(); if(manager instanceof DeltaManager && ((ClusterManager) manager).isDefaultMode()) { IntrospectionUtils.setProperty(manager, key, pvalue ); } } } } } /** * get current config * * @param key * @return The property */ public Object getProperty(String key) { if (log.isTraceEnabled()) log.trace(sm.getString("SimpleTcpCluster.getProperty", key)); return properties.get(key); } /** * Get all properties keys * * @return An iterator over the property names. */ public Iterator getPropertyNames() { return properties.keySet().iterator(); } /** * remove a configured property. * * @param key */ public void removeProperty(String key) { properties.remove(key); } /** * transfer properties from cluster configuration to subelement bean. * @param prefix * @param bean */ protected void transferProperty(String prefix, Object bean) { if (prefix != null) { for (Iterator iter = getPropertyNames(); iter.hasNext();) { String pkey = (String) iter.next(); if (pkey.startsWith(prefix)) { String key = pkey.substring(prefix.length() + 1); Object value = getProperty(pkey); IntrospectionUtils.setProperty(bean, key, value.toString()); } } } } // --------------------------------------------------------- Public Methods /** * @return Returns the managers. */ public Map getManagers() { return managers; } public Channel getChannel() { return channel; } /** * 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 #addManager(String, Manager) * @see DeltaManager#start() */ public synchronized Manager createManager(String name) { if (log.isDebugEnabled()) log.debug("Creating ClusterManager for context " + name + " using class " + getManagerClassName()); Manager manager = null; try { manager = (Manager) getClass().getClassLoader().loadClass(getManagerClassName()).newInstance(); } catch (Exception x) { log.error("Unable to load class for replication manager", x); manager = new org.apache.catalina.ha.session.DeltaManager(); } finally { if(manager != null) { manager.setDistributable(true); if (manager instanceof ClusterManager) { ClusterManager cmanager = (ClusterManager) manager ; cmanager.setDefaultMode(true); cmanager.setName(getManagerName(name,manager)); cmanager.setCluster(this); } } } return manager; } /** * remove an application form cluster replication bus * * @see org.apache.catalina.ha.CatalinaCluster#removeManager(java.lang.String,Manager) */ public void removeManager(String name,Manager manager) { if (manager != null) { // Notify our interested LifecycleListeners lifecycle.fireLifecycleEvent(BEFORE_MANAGERUNREGISTER_EVENT,manager); managers.remove(getManagerName(name,manager)); if (manager instanceof ClusterManager) ((ClusterManager) manager).setCluster(null); // Notify our interested LifecycleListeners lifecycle.fireLifecycleEvent(AFTER_MANAGERUNREGISTER_EVENT, manager); } } /** * add an application to cluster replication bus * * @param name * of the context * @param manager * manager to register * @see org.apache.catalina.ha.CatalinaCluster#addManager(java.lang.String, * org.apache.catalina.Manager) */ public void addManager(String name, Manager manager) { if (!manager.getDistributable()) { log.warn("Manager with name " + name + " is not distributable, can't add as cluster manager"); return; } // Notify our interested LifecycleListeners lifecycle.fireLifecycleEvent(BEFORE_MANAGERREGISTER_EVENT, manager); String clusterName = getManagerName(name, manager); if (manager instanceof ClusterManager) { ClusterManager cmanager = (ClusterManager) manager ; cmanager.setName(clusterName); cmanager.setCluster(this); if(cmanager.isDefaultMode()) transferProperty("manager",cmanager); } managers.put(clusterName, manager); // Notify our interested LifecycleListeners lifecycle.fireLifecycleEvent(AFTER_MANAGERREGISTER_EVENT, manager); } /** * @param name * @param manager * @return */ public String getManagerName(String name, Manager manager) { String clusterName = name ; if(getContainer() instanceof Engine) { Container context = manager.getContainer() ; if(context != null && context instanceof Context) { Container host = ((Context)context).getParent(); if(host != null && host instanceof Host) clusterName = host.getName() + name ; } } return clusterName; } /* * Get Manager * * @see org.apache.catalina.ha.CatalinaCluster#getManager(java.lang.String) */ public Manager getManager(String name) { return (Manager) managers.get(name); } // ------------------------------------------------------ Lifecycle Methods /** * 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 ReplicationTransmitter#backgroundProcess() */ public void backgroundProcess() { if (clusterDeployer != null) clusterDeployer.backgroundProcess(); //send a heartbeat through the channel if ( channel !=null ) channel.heartbeat(); } /** * Add a lifecycle event listener to this component. * * @param listener * The listener to add */ public void addLifecycleListener(LifecycleListener listener) { lifecycle.addLifecycleListener(listener); } /** * Get the lifecycle listeners associated with this lifecycle. If this * Lifecycle has no listeners registered, a zero-length array is returned. */ public LifecycleListener[] findLifecycleListeners() { return lifecycle.findLifecycleListeners(); } /** * Remove a lifecycle event listener from this component. * * @param listener * The listener to remove */ public void removeLifecycleListener(LifecycleListener listener) { lifecycle.removeLifecycleListener(listener); } /** * Use as base to handle start/stop/periodic Events from host. Currently * only log the messages as trace level. *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -