mirror of
https://github.com/apache/activemq.git
synced 2025-02-08 11:05:59 +00:00
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:
parent
c4222aa588
commit
f793fbd7e6
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user