https://issues.apache.org/jira/browse/AMQ-3523 - NetworkConnector MBean unregistration can fail with a transport disconnect - leaving dangling mbean, fix and test

git-svn-id: https://svn.apache.org/repos/asf/activemq/trunk@1179355 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Gary Tully 2011-10-05 18:10:08 +00:00
parent c4222aa588
commit f793fbd7e6
4 changed files with 47 additions and 3 deletions

View File

@ -26,6 +26,7 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import javax.management.ObjectName;
import org.apache.activemq.Service;
import org.apache.activemq.advisory.AdvisorySupport;
import org.apache.activemq.broker.BrokerService;
@ -131,6 +132,7 @@ public abstract class DemandForwardingBridgeSupport implements NetworkBridge, Br
private final AtomicBoolean started = new AtomicBoolean();
private TransportConnection duplexInitiatingConnection;
private BrokerService brokerService = null;
private ObjectName mbeanObjectName;
public DemandForwardingBridgeSupport(NetworkBridgeConfiguration configuration, Transport localBroker, Transport remoteBroker) {
this.configuration = configuration;
@ -1289,4 +1291,12 @@ public abstract class DemandForwardingBridgeSupport implements NetworkBridge, Br
public void setBrokerService(BrokerService brokerService) {
this.brokerService = brokerService;
}
public void setMbeanObjectName(ObjectName objectName) {
this.mbeanObjectName = objectName;
}
public ObjectName getMbeanObjectName() {
return mbeanObjectName;
}
}

View File

@ -57,6 +57,10 @@ public class MBeanNetworkListener implements NetworkBridgeListener {
try {
ObjectName objectName = createNetworkBridgeObjectName(bridge);
AnnotatedMBean.registerMBean(brokerService.getManagementContext(), view, objectName);
bridge.setMbeanObjectName(objectName);
if (LOG.isDebugEnabled()) {
LOG.debug("registered: " + bridge + " as: " + objectName);
}
} catch (Throwable e) {
LOG.debug("Network bridge could not be registered in JMX: " + e.getMessage(), e);
}
@ -68,8 +72,10 @@ public class MBeanNetworkListener implements NetworkBridgeListener {
return;
}
try {
ObjectName objectName = createNetworkBridgeObjectName(bridge);
brokerService.getManagementContext().unregisterMBean(objectName);
ObjectName objectName = bridge.getMbeanObjectName();
if (objectName != null) {
brokerService.getManagementContext().unregisterMBean(objectName);
}
} catch (Throwable e) {
LOG.debug("Network bridge could not be unregistered in JMX: " + e.getMessage(), e);
}

View File

@ -16,6 +16,7 @@
*/
package org.apache.activemq.network;
import javax.management.ObjectName;
import org.apache.activemq.Service;
@ -56,4 +57,8 @@ public interface NetworkBridge extends Service {
long getEnqueueCounter();
long getDequeueCounter();
void setMbeanObjectName(ObjectName objectName);
ObjectName getMbeanObjectName();
}

View File

@ -18,11 +18,14 @@ package org.apache.activemq.network;
import java.net.URI;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import javax.jms.Connection;
@ -30,6 +33,7 @@ import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.management.ObjectName;
import javax.net.ssl.KeyManager;
import javax.net.ssl.TrustManager;
@ -66,7 +70,7 @@ public class FailoverStaticNetworkTest {
protected BrokerService createBroker(String scheme, String listenPort, String[] networkToPorts,
HashMap<String, String> networkProps) throws Exception {
BrokerService broker = new BrokerService();
broker.setUseJmx(false);
//broker.setUseJmx(false);
broker.getManagementContext().setCreateConnector(false);
broker.setSslContext(sslContext);
broker.setDeleteAllMessagesOnStartup(true);
@ -155,6 +159,10 @@ public class FailoverStaticNetworkTest {
brokerB.start();
doTestNetworkSendReceive();
// check mbean
Set<String> bridgeNames = getNetworkBridgeMBeanName(brokerB);
assertEquals("only one bridgeName: " + bridgeNames, 1, bridgeNames.size());
LOG.info("stopping brokerA");
brokerA.stop();
brokerA.waitUntilStopped();
@ -164,6 +172,21 @@ public class FailoverStaticNetworkTest {
brokerA.start();
doTestNetworkSendReceive();
Set<String> otherBridgeNames = getNetworkBridgeMBeanName(brokerB);
assertEquals("only one bridgeName: " + otherBridgeNames, 1, otherBridgeNames.size());
assertTrue("there was an addition", bridgeNames.addAll(otherBridgeNames));
}
private Set<String> getNetworkBridgeMBeanName(BrokerService brokerB) throws Exception {
Set<String> names = new HashSet<String>();
for (ObjectName objectName : brokerB.getManagementContext().queryNames(null, null)) {
if ("NetworkBridge".equals(objectName.getKeyProperty("Type"))) {
names.add(objectName.getKeyProperty("Name"));
}
}
return names;
}
@Test