You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2013/01/02 08:03:29 UTC
svn commit: r1427682 - in /camel/branches/camel-2.10.x: ./
camel-core/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
camel-core/src/test/java/org/apache/camel/management/JmxInstrumentationWithConnectorTest.java
Author: davsclaus
Date: Wed Jan 2 07:03:29 2013
New Revision: 1427682
URL: http://svn.apache.org/viewvc?rev=1427682&view=rev
Log:
CAMEL-5907 Fixed the Camel leaks memory on undeploy / redeploy in app server when JMX enabled and createConnector = true with thanks to Daniel
Modified:
camel/branches/camel-2.10.x/ (props changed)
camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
camel/branches/camel-2.10.x/camel-core/src/test/java/org/apache/camel/management/JmxInstrumentationWithConnectorTest.java
Propchange: camel/branches/camel-2.10.x/
------------------------------------------------------------------------------
Merged /camel/trunk:r1425724
Propchange: camel/branches/camel-2.10.x/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified: camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/management/DefaultManagementAgent.java?rev=1427682&r1=1427681&r2=1427682&view=diff
==============================================================================
--- camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/management/DefaultManagementAgent.java (original)
+++ camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/management/DefaultManagementAgent.java Wed Jan 2 07:03:29 2013
@@ -20,8 +20,11 @@ import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.net.UnknownHostException;
+import java.rmi.NoSuchObjectException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
+import java.rmi.server.UnicastRemoteObject;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -58,9 +61,10 @@ public class DefaultManagementAgent exte
private CamelContext camelContext;
private MBeanServer server;
- // need a name -> actual name mapping as some servers changes the names (suc as WebSphere)
+ // need a name -> actual name mapping as some servers changes the names (such as WebSphere)
private final Map<ObjectName, ObjectName> mbeansRegistered = new HashMap<ObjectName, ObjectName>();
private JMXConnectorServer cs;
+ private Registry registry;
private Integer registryPort;
private Integer connectorPort;
@@ -257,7 +261,7 @@ public class DefaultManagementAgent exte
}
protected void doStop() throws Exception {
- // close JMX Connector
+ // close JMX Connector, if it was created
if (cs != null) {
try {
cs.stop();
@@ -269,6 +273,16 @@ public class DefaultManagementAgent exte
cs = null;
}
+ // Unexport JMX RMI registry, if it was created
+ if (registry != null) {
+ try {
+ UnicastRemoteObject.unexportObject(registry, true);
+ LOG.debug("Unexported JMX RMI Registry");
+ } catch (NoSuchObjectException e) {
+ LOG.debug("Error occurred while unexporting JMX RMI registry. This exception will be ignored.");
+ }
+ }
+
if (mbeansRegistered.isEmpty()) {
return;
}
@@ -384,7 +398,7 @@ public class DefaultManagementAgent exte
ObjectHelper.notNull(registryPort, "registryPort");
try {
- LocateRegistry.createRegistry(registryPort);
+ registry = LocateRegistry.createRegistry(registryPort);
LOG.debug("Created JMXConnector RMI registry on port {}", registryPort);
} catch (RemoteException ex) {
// The registry may had been created, we could get the registry instead
Modified: camel/branches/camel-2.10.x/camel-core/src/test/java/org/apache/camel/management/JmxInstrumentationWithConnectorTest.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-2.10.x/camel-core/src/test/java/org/apache/camel/management/JmxInstrumentationWithConnectorTest.java?rev=1427682&r1=1427681&r2=1427682&view=diff
==============================================================================
--- camel/branches/camel-2.10.x/camel-core/src/test/java/org/apache/camel/management/JmxInstrumentationWithConnectorTest.java (original)
+++ camel/branches/camel-2.10.x/camel-core/src/test/java/org/apache/camel/management/JmxInstrumentationWithConnectorTest.java Wed Jan 2 07:03:29 2013
@@ -16,6 +16,9 @@
*/
package org.apache.camel.management;
+import java.rmi.NoSuchObjectException;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
import java.util.Locale;
import java.util.Random;
import javax.management.MBeanServerConnection;
@@ -33,6 +36,7 @@ public class JmxInstrumentationWithConne
protected String url;
protected JMXConnector clientConnector;
+ protected int registryPort;
@Override
protected boolean useJmx() {
@@ -56,14 +60,14 @@ public class JmxInstrumentationWithConne
protected void setUp() throws Exception {
sleepForConnection = 3000;
- int port = 30000 + new Random().nextInt(10000);
- log.info("Using port " + port);
- url = "service:jmx:rmi:///jndi/rmi://localhost:" + port + "/jmxrmi/camel";
+ registryPort = 30000 + new Random().nextInt(10000);
+ log.info("Using port " + registryPort);
+ url = "service:jmx:rmi:///jndi/rmi://localhost:" + registryPort + "/jmxrmi/camel";
// need to explicit set it to false to use non-platform mbs
System.setProperty(JmxSystemPropertyKeys.USE_PLATFORM_MBS, "false");
System.setProperty(JmxSystemPropertyKeys.CREATE_CONNECTOR, "true");
- System.setProperty(JmxSystemPropertyKeys.REGISTRY_PORT, "" + port);
+ System.setProperty(JmxSystemPropertyKeys.REGISTRY_PORT, "" + registryPort);
super.setUp();
}
@@ -90,4 +94,32 @@ public class JmxInstrumentationWithConne
}
return mbsc;
}
+
+ public void testRmiRegistryUnexported() throws Exception {
+
+ Registry registry = LocateRegistry.getRegistry(registryPort);
+
+ // before we stop the context the registry is still exported, so list() should work
+ Exception e;
+ try {
+ registry.list();
+ e = null;
+ } catch (NoSuchObjectException nsoe) {
+ e = nsoe;
+ }
+ assertNull(e);
+
+ // stop the Camel context
+ context.stop();
+
+ // stopping the Camel context unexported the registry, so list() should fail
+ Exception e2;
+ try {
+ registry.list();
+ e2 = null;
+ } catch (NoSuchObjectException nsoe) {
+ e2 = nsoe;
+ }
+ assertNotNull(e2);
+ }
}