| Method from org.apache.catalina.cluster.tcp.SimpleTcpCluster Detail: |
public void addClusterListener(MessageListener listener) {
if (listener != null && !clusterListeners.contains(listener)) {
clusterListeners.add(listener);
listener.setCluster(this);
}
}
add cluster message listener and register cluster to this listener |
public void addLifecycleListener(LifecycleListener listener) {
lifecycle.addLifecycleListener(listener);
}
Add a lifecycle event listener to this component. |
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);
}
add an application to cluster replication bus |
public void addValve(Valve valve) {
if (valve instanceof ClusterValve)
valves.add(valve);
}
Add cluster valve
Cluster Valves are only add to container when cluster is started! |
public void backgroundProcess() {
if (clusterDeployer != null)
clusterDeployer.backgroundProcess();
if (clusterSender != null)
clusterSender.backgroundProcess();
}
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. |
protected void createDefaultClusterListener() {
if (log.isInfoEnabled()) {
log.info(sm.getString(
"SimpleTcpCluster.default.addClusterListener",
getClusterName()));
}
ClusterSessionListener listener = new ClusterSessionListener();
transferProperty("listener",listener);
addClusterListener(listener);
}
Create default session cluster listener:
<ClusterListener
className="org.apache.catalina.cluster.session.ClusterSessionListener" />
|
protected void createDefaultClusterReceiver() {
if (log.isInfoEnabled()) {
log.info(sm.getString(
"SimpleTcpCluster.default.addClusterReceiver",
getClusterName()));
}
SocketReplicationListener receiver= new SocketReplicationListener();
receiver.setTcpListenAddress("auto");
receiver.setDoReceivedProcessingStats(true);
receiver.setTcpListenPort(8015);
receiver.setTcpListenMaxPort(8019);
transferProperty("receiver",receiver);
setClusterReceiver(receiver);
}
<Receiver
className="org.apache.catalina.cluster.tcp.SocketReplicationListener"
tcpListenAddress="auto"
tcpListenPort="8015"
tcpListenMaxPort="8019"
doReceivedProcessingStats="true"
/>
|
protected void createDefaultClusterSender() {
if (log.isInfoEnabled()) {
log.info(sm.getString(
"SimpleTcpCluster.default.addClusterSender",
getClusterName()));
}
ReplicationTransmitter sender= new ReplicationTransmitter();
sender.setReplicationMode("fastasyncqueue");
sender.setDoTransmitterProcessingStats(true);
sender.setProperty("doProcessingStats", "true");
transferProperty("sender",sender);
setClusterSender(sender);
}
Create default cluster sender
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="fastasyncqueue"
doTransmitterProcessingStats="true"
doProcessingStats="true"/>
|
protected void createDefaultClusterValves() {
if (log.isInfoEnabled()) {
log.info(sm.getString(
"SimpleTcpCluster.default.addClusterValves",
getClusterName()));
}
ReplicationValve valve= new ReplicationValve() ;
valve.setFilter(".*\\.gif;.*\\.js;.*\\.css;.*\\.png;.*\\.jpeg;.*\\.jpg;.*\\.htm;.*\\.html;.*\\.txt;");
valve.setPrimaryIndicator(true);
transferProperty("valve",valve);
addValve(valve);
}
Create default ReplicationValve
<Valve
className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.css;.*\.png;.*\.jpeg;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"
primaryIndicator="true" />
|
protected void createDefaultMembershipService() {
if (log.isInfoEnabled()) {
log.info(sm.getString(
"SimpleTcpCluster.default.addMembershipService",
getClusterName()));
}
McastService mService= new McastService();
mService.setMcastAddr("228.0.0.4");
mService.setMcastPort(8012);
mService.setMcastFrequency(1000);
mService.setMcastDropTime(30000);
transferProperty("service",mService);
setMembershipService(mService);
}
Create default membership service:
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="8012"
mcastFrequency="1000"
mcastDropTime="30000"/>
|
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.cluster.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;
}
Create new Manager without add to cluster (comes with start the manager) |
public MessageListener[] findClusterListeners() {
if (clusterListeners.size() > 0) {
MessageListener[] listener = new MessageListener[clusterListeners
.size()];
clusterListeners.toArray(listener);
return listener;
} else
return new MessageListener[0];
}
Get the cluster listeners associated with this cluster. If this Array has
no listeners registered, a zero-length array is returned. |
public LifecycleListener[] findLifecycleListeners() {
return lifecycle.findLifecycleListeners();
}
Get the lifecycle listeners associated with this lifecycle. If this
Lifecycle has no listeners registered, a zero-length array is returned. |
public ClusterDeployer getClusterDeployer() {
return clusterDeployer;
}
|
public Log getClusterLog() {
if (clusterLog == null && clusterLogName != null
&& !"".equals(clusterLogName))
clusterLog = LogFactory.getLog(clusterLogName);
return clusterLog;
}
|
public String getClusterLogName() {
return clusterLogName;
}
|
public String getClusterName() {
if(clusterName == null && container != null)
return container.getName() ;
return clusterName;
}
Return the name of the cluster that this Server is currently configured
to operate within. |
public ClusterReceiver getClusterReceiver() {
return clusterReceiver;
}
|
public ClusterSender getClusterSender() {
return clusterSender;
}
|
public Container getContainer() {
return (this.container);
}
Get the Container associated with our Cluster |
public String getInfo() {
return (info);
}
Return descriptive information about this Cluster implementation and the
corresponding version number, in the format
<description>/<version>. |
public Member getLocalMember() {
return membershipService.getLocalMember();
}
Return the member that represents this node. |
public Log getLogger() {
return log;
}
|
public MBeanServer getMBeanServer() throws Exception {
if (mserver == null) {
if (MBeanServerFactory.findMBeanServer(null).size() > 0) {
mserver = (MBeanServer) MBeanServerFactory
.findMBeanServer(null).get(0);
} else {
mserver = MBeanServerFactory.createMBeanServer();
}
registry = Registry.getRegistry(null, null);
registry.loadMetadata(this.getClass().getResourceAsStream(
"mbeans-descriptors.xml"));
}
return (mserver);
}
Get current Catalina MBean Server and load mbean registry |
public ModelMBean getManagedBean(Object object) throws Exception {
ModelMBean mbean = null;
if (registry != null) {
ManagedBean managedBean = registry.findManagedBean(object
.getClass().getName());
mbean = managedBean.createMBean(object);
}
return mbean;
}
|
public Manager getManager(String name) {
return (Manager) managers.get(name);
}
|
public String getManagerClassName() {
if(managerClassName != null)
return managerClassName;
return (String)getProperty("manager.className");
}
|
public Map getManagers() {
return managers;
}
|
public Member[] getMembers() {
Member[] members = membershipService.getMembers();
if(members != null) {
//sort by alive time
java.util.Arrays.sort(members, memberComparator);
} else
members = new Member[0];
return members;
}
Get all current cluster members |
public MembershipService getMembershipService() {
return membershipService;
}
|
public ObjectName getObjectName() {
return objectName;
}
|
public Object getProperty(String key) {
if (log.isTraceEnabled())
log.trace(sm.getString("SimpleTcpCluster.getProperty", key));
return properties.get(key);
}
|
public Iterator getPropertyNames() {
return properties.keySet().iterator();
}
|
public String getProtocol() {
return null;
}
|
public Valve[] getValves() {
return (Valve[]) valves.toArray(new Valve[valves.size()]);
}
|
public void installContext(String contextPath,
URL war) {
}
|
public boolean isDefaultMode() {
return defaultMode;
}
|
public boolean isDoClusterLog() {
return doClusterLog;
}
|
public boolean isNotifyLifecycleListenerOnFailure() {
return notifyLifecycleListenerOnFailure;
}
|
public void lifecycleEvent(LifecycleEvent lifecycleEvent) {
if (log.isTraceEnabled())
log.trace(sm.getString("SimpleTcpCluster.event.log", lifecycleEvent
.getType(), lifecycleEvent.getData()));
}
Use as base to handle start/stop/periodic Events from host. Currently
only log the messages as trace level. |
protected void logReceiveMessage(ClusterMessage message,
long start,
boolean accepted) {
if (clusterLog != null && clusterLog.isInfoEnabled()) {
clusterLog.info(sm.getString("SimpleTcpCluster.log.receive", new Object[] {
new Date(start),
new Long(System.currentTimeMillis() - start),
message.getAddress().getHost(),
new Integer(message.getAddress().getPort()),
message.getUniqueId(), new Boolean(accepted) }));
}
}
log received message to cluster transfer log |
protected void logSendMessage(ClusterMessage message,
long start,
Member dest) {
if (clusterLog != null && clusterLog.isInfoEnabled()) {
if (dest != null) {
clusterLog.info(sm.getString("SimpleTcpCluster.log.send",
new Object[] { new Date(start),
new Long(System.currentTimeMillis() - start),
dest.getHost(), new Integer(dest.getPort()),
message.getUniqueId() }));
} else {
clusterLog.info(sm.getString("SimpleTcpCluster.log.send.all",
new Object[] { new Date(start),
new Long(System.currentTimeMillis() - start),
message.getUniqueId() }));
}
}
}
log sended message to cluster transfer log |
public void memberAdded(Member member) {
try {
if (log.isInfoEnabled())
log.info("Replication member added:" + member);
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(BEFORE_MEMBERREGISTER_EVENT, member);
clusterSender.add(member);
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(AFTER_MEMBERREGISTER_EVENT, member);
} catch (Exception x) {
log.error("Unable to connect to replication system.", x);
}
}
New cluster member is registered |
public void memberDisappeared(Member member) {
if (log.isInfoEnabled())
log.info("Received member disappeared:" + member);
try {
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(BEFORE_MEMBERUNREGISTER_EVENT, member);
clusterSender.remove(member);
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(AFTER_MEMBERUNREGISTER_EVENT, member);
} catch (Exception x) {
log.error("Unable remove cluster node from replication system.", x);
}
}
|
public void receive(ClusterMessage message) {
long start = 0;
if (doClusterLog)
start = System.currentTimeMillis();
if (log.isDebugEnabled() && message != null)
log.debug("Assuming clocks are synched: Replication for "
+ message.getUniqueId() + " took="
+ (System.currentTimeMillis() - (message).getTimestamp())
+ " ms.");
//invoke all the listeners
boolean accepted = false;
if (message != null) {
for (Iterator iter = clusterListeners.iterator(); iter.hasNext();) {
MessageListener listener = (MessageListener) iter.next();
if (listener.accept(message)) {
accepted = true;
listener.messageReceived(message);
}
}
}
if (!accepted && log.isDebugEnabled()) {
if (notifyLifecycleListenerOnFailure) {
Member dest = message.getAddress();
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(RECEIVE_MESSAGE_FAILURE_EVENT,
new SendMessageData(message, dest, null));
}
log.debug("Message " + message.toString() + " from type "
+ message.getClass().getName()
+ " transfered but no listener registered");
}
if (doClusterLog)
logReceiveMessage(message, start, accepted);
}
notify all listeners from receiving a new message is not ClusterMessage
emitt Failure Event to LifecylceListener |
protected void registerClusterValve() throws Exception {
for (Iterator iter = valves.iterator(); iter.hasNext();) {
ClusterValve valve = (ClusterValve) iter.next();
if (log.isDebugEnabled())
log.debug("Invoking addValve on " + getContainer()
+ " with class=" + valve.getClass().getName());
if (valve != null) {
IntrospectionUtils.callMethodN(getContainer(), "addValve",
new Object[] { valve }, new Class[] { org.apache.catalina.Valve.class });
}
valve.setCluster(this);
}
}
register all cluster valve to host or engine |
protected void registerMBeans() {
try {
getMBeanServer();
String domain = mserver.getDefaultDomain();
String name = ":type=Cluster";
if (container instanceof StandardHost) {
domain = ((StandardHost) container).getDomain();
name += ",host=" + container.getName();
} else {
if (container instanceof StandardEngine) {
domain = ((StandardEngine) container).getDomain();
}
}
ObjectName clusterName = new ObjectName(domain + name);
if (mserver.isRegistered(clusterName)) {
if (log.isWarnEnabled())
log.warn(sm.getString("cluster.mbean.register.allready",
clusterName));
return;
}
setObjectName(clusterName);
mserver.registerMBean(getManagedBean(this), getObjectName());
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
}
register Means at cluster. |
public void removeClusterListener(MessageListener listener) {
if (listener != null) {
clusterListeners.remove(listener);
listener.setCluster(null);
}
}
remove message listener and deregister Cluster from listener |
public void removeLifecycleListener(LifecycleListener listener) {
lifecycle.removeLifecycleListener(listener);
}
Remove a lifecycle event listener from this component. |
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);
}
}
remove an application form cluster replication bus |
public void removeProperty(String key) {
properties.remove(key);
}
remove a configured property. |
public void send(ClusterMessage msg) {
send(msg, null);
}
send message to all cluster members |
public void send(ClusterMessage msg,
Member dest) {
long start = 0;
if (doClusterLog)
start = System.currentTimeMillis();
try {
msg.setAddress(membershipService.getLocalMember());
if (dest != null) {
if (!membershipService.getLocalMember().equals(dest)) {
clusterSender.sendMessage(msg, dest);
} else
log.error("Unable to send message to local member " + msg);
} else {
clusterSender.sendMessage(msg);
}
} catch (Exception x) {
if (notifyLifecycleListenerOnFailure) {
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(SEND_MESSAGE_FAILURE_EVENT,
new SendMessageData(msg, dest, x));
}
log.error("Unable to send message through cluster sender.", x);
}
if (doClusterLog)
logSendMessage(msg, start, dest);
}
send a cluster message to one member |
public void sendClusterDomain(ClusterMessage msg) {
long start = 0;
if (doClusterLog)
start = System.currentTimeMillis();
try {
msg.setAddress(membershipService.getLocalMember());
clusterSender.sendMessageClusterDomain(msg);
} catch (Exception x) {
if (notifyLifecycleListenerOnFailure) {
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(SEND_MESSAGE_FAILURE_EVENT,
new SendMessageData(msg, null, x));
}
log.error("Unable to send message through cluster sender.", x);
}
if (doClusterLog)
logSendMessage(msg, start, null);
}
send message to all cluster members same cluster domain |
public void sendToMember(ClusterMessage msg,
String dest) {
Member member = getMembershipService().findMemberByName(dest);
if (member != null) {
send(msg, member);
} else {
log.error("sendToMember: member " + dest + " not found!");
}
}
send a cluster message to one member (very usefull JMX method for remote scripting) |
public void setClusterDeployer(ClusterDeployer clusterDeployer) {
this.clusterDeployer = clusterDeployer;
}
|
public void setClusterLogName(String clusterLogName) {
this.clusterLogName = clusterLogName;
}
|
public void setClusterName(String clusterName) {
this.clusterName = clusterName;
}
Set the name of the cluster to join, if no cluster with this name is
present create one. |
public void setClusterReceiver(ClusterReceiver clusterReceiver) {
this.clusterReceiver = clusterReceiver;
}
|
public void setClusterSender(ClusterSender clusterSender) {
this.clusterSender = clusterSender;
}
|
public void setContainer(Container container) {
Container oldContainer = this.container;
this.container = container;
support.firePropertyChange("container", oldContainer, this.container);
}
Set the Container associated with our Cluster |
public void setDefaultMode(boolean defaultMode) {
this.defaultMode = defaultMode;
}
|
public void setDoClusterLog(boolean doClusterLog) {
this.doClusterLog = doClusterLog;
}
|
public void setManagerClassName(String managerClassName) {
this.managerClassName = managerClassName;
}
|
public void setMembershipService(MembershipService membershipService) {
this.membershipService = membershipService;
}
|
public void setNotifyLifecycleListenerOnFailure(boolean notifyListenerOnFailure) {
boolean oldNotifyListenerOnFailure = this.notifyLifecycleListenerOnFailure;
this.notifyLifecycleListenerOnFailure = notifyListenerOnFailure;
support.firePropertyChange("notifyLifecycleListenerOnFailure",
oldNotifyListenerOnFailure,
this.notifyLifecycleListenerOnFailure);
}
|
public void setObjectName(ObjectName name) {
objectName = name;
}
|
public void setProperty(String name,
String value) {
setProperty(name, (Object) value);
}
JMX hack to direct use at jconsole |
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 );
}
}
}
}
}
set config attributes with reflect and propagate to all managers |
public void setProtocol(String protocol) {
}
|
public void start() throws LifecycleException {
if (started)
throw new LifecycleException(sm.getString("cluster.alreadyStarted"));
if (log.isInfoEnabled())
log.info("Cluster is about to start");
getClusterLog();
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, this);
try {
if(isDefaultMode() && valves.size() == 0) {
createDefaultClusterValves() ;
}
registerClusterValve();
registerMBeans();
// setup the default cluster session listener (DeltaManager support)
if(isDefaultMode() && clusterListeners.size() == 0) {
createDefaultClusterListener();
}
// setup the default cluster Receiver
if(isDefaultMode() && clusterReceiver == null) {
createDefaultClusterReceiver();
}
// setup the default cluster sender
if(isDefaultMode() && clusterSender == null) {
createDefaultClusterSender();
}
// start the receiver.
if(clusterReceiver != null) {
clusterReceiver.setSendAck(clusterSender.isWaitForAck());
clusterReceiver.setCompress(clusterSender.isCompress());
clusterReceiver.setCatalinaCluster(this);
clusterReceiver.start();
}
// start the sender.
if(clusterSender != null && clusterReceiver != null) {
clusterSender.setCatalinaCluster(this);
clusterSender.start();
}
// start the membership service.
if(isDefaultMode() && membershipService == null) {
createDefaultMembershipService();
}
if(membershipService != null && clusterReceiver != null) {
membershipService.setLocalMemberProperties(clusterReceiver
.getHost(), clusterReceiver.getPort());
membershipService.addMembershipListener(this);
membershipService.setCatalinaCluster(this);
membershipService.start();
// start the deployer.
try {
if (clusterDeployer != null) {
clusterDeployer.setCluster(this);
clusterDeployer.start();
}
} catch (Throwable x) {
log.fatal("Unable to retrieve the container deployer. Cluster deployment disabled.",x);
}
}
this.started = true;
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(AFTER_START_EVENT, this);
} catch (Exception x) {
log.error("Unable to start cluster.", x);
throw new LifecycleException(x);
}
}
Prepare for the beginning of active use of the public methods of this
component. This method should be called after configure(),
and before any of the public methods of the component are utilized.
Starts the cluster communication channel, this will connect with the
other nodes in the cluster, and request the current session state to be
transferred to this node. |
public void startContext(String contextPath) throws IOException {
}
|
public void stop() throws LifecycleException {
if (!started)
throw new IllegalStateException(sm.getString("cluster.notStarted"));
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(BEFORE_STOP_EVENT, this);
if (clusterDeployer != null) {
clusterDeployer.stop();
}
// FIXME remove registered managers!!
if(membershipService != null) {
membershipService.stop();
membershipService.removeMembershipListener();
}
if(clusterSender != null) {
try {
clusterSender.stop();
} catch (Exception x) {
log.error("Unable to stop cluster sender.", x);
}
}
if(clusterReceiver != null ){
try {
clusterReceiver.stop();
clusterReceiver.setCatalinaCluster(null);
} catch (Exception x) {
log.error("Unable to stop cluster receiver.", x);
}
}
unregisterMBeans();
try {
unregisterClusterValve();
} catch (Exception x) {
log.error("Unable to stop cluster valve.", x);
}
started = false;
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(AFTER_STOP_EVENT, this);
clusterLog = null ;
}
Gracefully terminate the active cluster component.
This will disconnect the cluster communication channel, stop the
listener and deregister the valves from host or engine.
Note: The sub elements receiver, sender, membership,
listener or valves are not removed. You can easily start the cluster again. |
public void stop(String contextPath) throws IOException {
}
|
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());
}
}
}
}
transfer properties from cluster configuration to subelement bean. |
protected void unregisterClusterValve() throws Exception {
for (Iterator iter = valves.iterator(); iter.hasNext();) {
ClusterValve valve = (ClusterValve) iter.next();
if (log.isDebugEnabled())
log.debug("Invoking removeValve on " + getContainer()
+ " with class=" + valve.getClass().getName());
if (valve != null) {
IntrospectionUtils.callMethodN(getContainer(), "removeValve",
new Object[] { valve }, new Class[] { org.apache.catalina.Valve.class });
}
valve.setCluster(this);
}
}
unregister all cluster valve to host or engine |
protected void unregisterMBeans() {
if (mserver != null) {
try {
mserver.unregisterMBean(getObjectName());
} catch (Exception e) {
log.error(e);
}
}
}
|