You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by ve...@apache.org on 2008/06/15 23:32:46 UTC

svn commit: r668011 - in /synapse/trunk/java/modules: core/src/test/java/org/apache/synapse/n2n/ transports/src/main/java/org/apache/synapse/transport/base/ transports/src/main/java/org/apache/synapse/transport/nhttp/ transports/src/test/java/org/apach...

Author: veithen
Date: Sun Jun 15 14:32:46 2008
New Revision: 668011

URL: http://svn.apache.org/viewvc?rev=668011&view=rev
Log:
JMX support in transport listeners and senders:
* Elimination of duplicate code.
* Make sure that all listeners/senders unregister the MBean on shutdown.
* When the MBean registration fails, instead of silently unregistering the previously registered instance, a warning message is logged and JMX support is disabled. This happens when the same transport runs multiple times in the same VM. In this case, the user should be made aware of the fact that JMX support is not working as expected.
* Modified some unit tests to avoid the issue described in the previous item.

Added:
    synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/base/TransportMBeanSupport.java
Modified:
    synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/n2n/SynapseCommodityServiceTest.java
    synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/base/AbstractTransportListener.java
    synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/base/AbstractTransportSender.java
    synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOListener.java
    synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java
    synapse/trunk/java/modules/transports/src/test/java/org/apache/synapse/transport/AbstractTransportTest.java
    synapse/trunk/java/modules/transports/src/test/java/org/apache/synapse/transport/UtilsTransportServer.java

Modified: synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/n2n/SynapseCommodityServiceTest.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/n2n/SynapseCommodityServiceTest.java?rev=668011&r1=668010&r2=668011&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/n2n/SynapseCommodityServiceTest.java (original)
+++ synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/n2n/SynapseCommodityServiceTest.java Sun Jun 15 14:32:46 2008
@@ -104,6 +104,7 @@
         synTrsIn = (TransportInDescription)
             synapseConfigCtx.getAxisConfiguration().getTransportsIn().get("https");
         synTrsIn.getParameter("port").setValue("12100");
+        System.setProperty("jmx.agent.name", "synapse");
         startServer(synapseConfigCtx);
 
         TransportInDescription busTrsIn = (TransportInDescription)
@@ -112,6 +113,9 @@
         busTrsIn = (TransportInDescription)
             businessConfigCtx.getAxisConfiguration().getTransportsIn().get("https");
         busTrsIn.getParameter("port").setValue("12101");
+        // Set a different agent name to avoid collisions between the MBeans registered
+        // by the two servers.
+        System.setProperty("jmx.agent.name", "business");
         startServer(businessConfigCtx);
     }
 

Modified: synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/base/AbstractTransportListener.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/base/AbstractTransportListener.java?rev=668011&r1=668010&r2=668011&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/base/AbstractTransportListener.java (original)
+++ synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/base/AbstractTransportListener.java Sun Jun 15 14:32:46 2008
@@ -67,6 +67,8 @@
     protected WorkerPool workerPool = null;
     /** use the thread pool available in the axis2 configuration context */
     protected boolean useAxis2ThreadPool = false;
+    /** JMX support */
+    private TransportMBeanSupport mbeanSupport;
     /** Metrics collector for this transport */
     protected MetricsCollector metrics = new MetricsCollector();
 
@@ -105,7 +107,8 @@
         cfgCtx.getAxisConfiguration().addObservers(axisObserver);
 
         // register with JMX
-        registerMBean(new TransportView(this, null), getMBeanName());
+        mbeanSupport = new TransportMBeanSupport(this, getTransportName());
+        mbeanSupport.register();
     }
 
     public void destroy() {
@@ -119,7 +122,7 @@
             }
         } finally {
             state = BaseConstants.STOPPED;
-            unregisterMBean(getMBeanName());
+            mbeanSupport.unregister();
         }
         try {
             workerPool.shutdown(10000);
@@ -426,16 +429,8 @@
         return -1;
     }
 
-    private String getMBeanName() {
-        String jmxAgentName = System.getProperty("jmx.agent.name");
-        if (jmxAgentName == null || "".equals(jmxAgentName)) {
-            jmxAgentName = "org.apache.synapse";
-        }
-        return jmxAgentName + ":Type=Transport,ConnectorName=" + getTransportName() + "-listener";
-    }
-    
     private String getEndpointMBeanName(String serviceName) {
-        return getMBeanName() + ",Group=Services,Service=" + serviceName;
+        return mbeanSupport.getMBeanName() + ",Group=Services,Service=" + serviceName;
     }
     
     /**

Modified: synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/base/AbstractTransportSender.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/base/AbstractTransportSender.java?rev=668011&r1=668010&r2=668011&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/base/AbstractTransportSender.java (original)
+++ synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/base/AbstractTransportSender.java Sun Jun 15 14:32:46 2008
@@ -54,6 +54,8 @@
     private TransportInDescription transportIn  = null;
     /** transport out description */
     private TransportOutDescription transportOut = null;
+    /** JMX support */
+    private TransportMBeanSupport mbeanSupport;
     /** Metrics collector for the sender */
     protected MetricsCollector metrics = new MetricsCollector();
     /** state of the listener */
@@ -75,26 +77,15 @@
         this.state = BaseConstants.STARTED;
 
         // register with JMX
-        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
-        String jmxAgentName = System.getProperty("jmx.agent.name");
-        if (jmxAgentName == null || "".equals(jmxAgentName)) {
-            jmxAgentName = "org.apache.synapse";
-        }
-        String name;
-        try {
-            name = jmxAgentName + ":Type=Transport,ConnectorName=" +
-                getTransportName() + "-sender";
-            TransportView tBean = new TransportView(null, this);
-            registerMBean(mbs, tBean, name);
-        } catch (Exception e) {
-            log.warn("Error registering the " + getTransportName() + " transport for JMX management", e);
-        }
+        mbeanSupport = new TransportMBeanSupport(this, getTransportName());
+        mbeanSupport.register();
         log.info(getTransportName().toUpperCase() + " Sender started");
     }
 
     public void stop() {
         if (state != BaseConstants.STARTED) return;
         state = BaseConstants.STOPPED;
+        mbeanSupport.unregister();
         log.info(getTransportName().toUpperCase() + " Sender Shutdown");
     }
 

Added: synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/base/TransportMBeanSupport.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/base/TransportMBeanSupport.java?rev=668011&view=auto
==============================================================================
--- synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/base/TransportMBeanSupport.java (added)
+++ synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/base/TransportMBeanSupport.java Sun Jun 15 14:32:46 2008
@@ -0,0 +1,115 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.synapse.transport.base;
+
+import java.lang.management.ManagementFactory;
+
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.apache.axis2.transport.TransportListener;
+import org.apache.axis2.transport.TransportSender;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Support class to register MBeans for transport listeners and senders.
+ * This class can be used by {@link TransportListener} and {@link TransportSender} classes
+ * to register the {@link TransportView} management bean. It takes care of registering
+ * the bean under a consistent name and makes sure that a JMX related error doesn't stop
+ * the transport from working: a failure to register the MBean will cause JMX support
+ * to be disabled.
+ */
+public class TransportMBeanSupport {
+    private static final Log log = LogFactory.getLog(TransportMBeanSupport.class);
+    
+    private boolean enabled = true;
+    private boolean registered;
+    private MBeanServer mbs;
+    private ObjectName mbeanName;
+    private TransportView mbeanInstance;
+    
+    private TransportMBeanSupport(String connectorName, TransportView mbeanInstance) {
+        try {
+            mbs = ManagementFactory.getPlatformMBeanServer();
+        } catch (SecurityException ex) {
+            log.warn("Unable to get the platform MBean server; JMX support disabled", ex);
+            enabled = false;
+            return;
+        }
+        String jmxAgentName = System.getProperty("jmx.agent.name");
+        if (jmxAgentName == null || "".equals(jmxAgentName)) {
+            jmxAgentName = "org.apache.synapse";
+        }
+        String mbeanNameString = jmxAgentName + ":Type=Transport,ConnectorName=" + connectorName;
+        try {
+            mbeanName = ObjectName.getInstance(mbeanNameString);
+        } catch (MalformedObjectNameException ex) {
+            log.warn("Unable to create object name '" + mbeanNameString
+                        + "'; JMX support disabled", ex);
+            enabled = false;
+        }
+        this.mbeanInstance = mbeanInstance;
+    }
+    
+    public TransportMBeanSupport(TransportListener listener, String name) {
+        this(name + "-listener", new TransportView(listener, null));
+    }
+    
+    public TransportMBeanSupport(TransportSender sender, String name) {
+        this(name + "-sender", new TransportView(null, sender));
+    }
+    
+    public ObjectName getMBeanName() {
+        return mbeanName;
+    }
+    
+    /**
+     * Register the {@link TransportView} MBean.
+     */
+    public void register() {
+        if (enabled && !registered) {
+            try {
+                mbs.registerMBean(mbeanInstance, mbeanName);
+                registered = true;
+            } catch (Exception e) {
+                log.warn("Error registering a MBean with objectname ' " + mbeanName +
+                    " ' for JMX management", e);
+                enabled = false;
+            }
+        }
+    }
+    
+    /**
+     * Unregister the {@link TransportView} MBean.
+     */
+    public void unregister() {
+        if (enabled && registered) {
+            try {
+                mbs.unregisterMBean(mbeanName);
+                registered = false;
+            } catch (Exception e) {
+                log.warn("Error un-registering a MBean with objectname ' " + mbeanName +
+                    " ' for JMX management", e);
+            }
+        }
+    }
+}

Modified: synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOListener.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOListener.java?rev=668011&r1=668010&r2=668011&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOListener.java (original)
+++ synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOListener.java Sun Jun 15 14:32:46 2008
@@ -23,11 +23,8 @@
 import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
 import java.net.InetAddress;
-import java.lang.management.ManagementFactory;
-import java.util.Set;
 
 import javax.net.ssl.SSLContext;
-import javax.management.*;
 
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.addressing.EndpointReference;
@@ -51,7 +48,7 @@
 import org.apache.synapse.transport.base.ManagementSupport;
 import org.apache.synapse.transport.base.MetricsCollector;
 import org.apache.synapse.transport.base.BaseConstants;
-import org.apache.synapse.transport.base.TransportView;
+import org.apache.synapse.transport.base.TransportMBeanSupport;
 
 /**
  * NIO transport listener for Axis2 based on HttpCore and NIO extensions
@@ -77,6 +74,8 @@
     private SSLContext sslContext = null;
     /** The SSL session handler that manages client authentication etc */
     private SSLIOSessionHandler sslIOSessionHandler = null;
+    /** JMX support */
+    private TransportMBeanSupport mbeanSupport;
     /** Metrics collector for this transport */
     private MetricsCollector metrics = new MetricsCollector();
     /** state of the listener */
@@ -199,21 +198,9 @@
         }
 
         // register with JMX
-        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
-        String jmxAgentName = System.getProperty("jmx.agent.name");
-        if (jmxAgentName == null || "".equals(jmxAgentName)) {
-            jmxAgentName = "org.apache.synapse";
-        }
-        String name;
-        try {
-            name = jmxAgentName + ":Type=Transport,ConnectorName=" +
-                "nio-http" + (sslContext == null ? "" : "s") + "-listener";
-            TransportView tBean = new TransportView(this, null);
-            registerMBean(mbs, tBean, name);
-        } catch (Exception e) {
-            log.warn("Error registering the non-blocking http" +
-                (sslContext == null ? "" : "s") + " transport for JMX management", e);
-        }
+        mbeanSupport
+            = new TransportMBeanSupport(this, "nio-http" + (sslContext == null ? "" : "s"));
+        mbeanSupport.register();
     }
 
     /**
@@ -396,6 +383,7 @@
 
     public void destroy() {
         ioReactor = null;
+        mbeanSupport.unregister();
     }
 
     // -------------- utility methods -------------
@@ -451,20 +439,4 @@
         }
         return -1;
     }
-
-    private void registerMBean(MBeanServer mbs, Object mbeanInstance, String objectName) {
-        try {
-            ObjectName name = new ObjectName(objectName);
-            Set set = mbs.queryNames(name, null);
-            if (set != null && set.isEmpty()) {
-                mbs.registerMBean(mbeanInstance, name);
-            } else {
-                mbs.unregisterMBean(name);
-                mbs.registerMBean(mbeanInstance, name);
-            }
-        } catch (Exception e) {
-            log.warn("Error registering a MBean with objectname ' " + objectName +
-                " ' for JMX management", e);
-        }
-    }
 }

Modified: synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java?rev=668011&r1=668010&r2=668011&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java (original)
+++ synapse/trunk/java/modules/transports/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java Sun Jun 15 14:32:46 2008
@@ -54,22 +54,18 @@
 import org.apache.synapse.transport.base.BaseConstants;
 import org.apache.synapse.transport.base.ManagementSupport;
 import org.apache.synapse.transport.base.MetricsCollector;
-import org.apache.synapse.transport.base.TransportView;
+import org.apache.synapse.transport.base.TransportMBeanSupport;
 import org.apache.synapse.transport.nhttp.util.MessageFormatterDecoratorFactory;
 
-import javax.management.MBeanServer;
-import javax.management.ObjectName;
 import javax.net.ssl.SSLContext;
 import java.io.IOException;
 import java.io.InterruptedIOException;
 import java.io.OutputStream;
-import java.lang.management.ManagementFactory;
 import java.net.InetSocketAddress;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Iterator;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * NIO transport sender for Axis2 based on HttpCore and NIO extensions
@@ -90,6 +86,8 @@
     private SSLContext sslContext = null;
     /** The SSL session handler that manages hostname verification etc */
     private SSLIOSessionHandler sslIOSessionHandler = null;
+    /** JMX support */
+    private TransportMBeanSupport mbeanSupport;
     /** Metrics collector for the sender */
     private MetricsCollector metrics = new MetricsCollector();
     /** state of the listener */
@@ -118,22 +116,9 @@
         log.info((sslContext == null ? "HTTP" : "HTTPS") + " Sender starting");
 
         // register with JMX
-        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
-        String jmxAgentName = System.getProperty("jmx.agent.name");
-        if (jmxAgentName == null || "".equals(jmxAgentName)) {
-            jmxAgentName = "org.apache.synapse";
-        }
-        String name;
-        try {
-            name = jmxAgentName + ":Type=Transport,ConnectorName=" +
-                "nio-http" + (sslContext == null ? "" : "s") + "-sender";
-            TransportView tBean = new TransportView(null, this);
-            registerMBean(mbs, tBean, name);
-        } catch (Exception e) {
-            log.warn("Error registering the non-blocking http" +
-                (sslContext == null ? "" : "s") + " transport sender for JMX management", e);
-        }
-
+        mbeanSupport
+            = new TransportMBeanSupport(this, "nio-http" + (sslContext == null ? "" : "s"));
+        mbeanSupport.register();
     }
 
     /**
@@ -466,6 +451,7 @@
         } catch (IOException e) {
             log.warn("Error shutting down IOReactor", e);
         }
+        mbeanSupport.unregister();
     }
 
     /**
@@ -637,20 +623,4 @@
         }
         return -1;
     }
-
-    private void registerMBean(MBeanServer mbs, Object mbeanInstance, String objectName) {
-        try {
-            ObjectName name = new ObjectName(objectName);
-            Set set = mbs.queryNames(name, null);
-            if (set != null && set.isEmpty()) {
-                mbs.registerMBean(mbeanInstance, name);
-            } else {
-                mbs.unregisterMBean(name);
-                mbs.registerMBean(mbeanInstance, name);
-            }
-        } catch (Exception e) {
-            log.warn("Error registering a MBean with objectname ' " + objectName +
-                " ' for JMX management", e);
-        }
-    }
 }

Modified: synapse/trunk/java/modules/transports/src/test/java/org/apache/synapse/transport/AbstractTransportTest.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/src/test/java/org/apache/synapse/transport/AbstractTransportTest.java?rev=668011&r1=668010&r2=668011&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/src/test/java/org/apache/synapse/transport/AbstractTransportTest.java (original)
+++ synapse/trunk/java/modules/transports/src/test/java/org/apache/synapse/transport/AbstractTransportTest.java Sun Jun 15 14:32:46 2008
@@ -37,8 +37,14 @@
     private UtilsTransportServer server;
 
     protected void setUp() throws Exception {
+        // Temporarily change jmx.agent.name system property to avoid collisions
+        // between MBeans registered by the server context and those registered
+        // by the client context
+        String agentName = System.getProperty("jmx.agent.name", "org.apache.synapse");
+        System.setProperty("jmx.agent.name", agentName + "-server");
         server = createServer();
         server.start();
+        System.setProperty("jmx.agent.name", agentName);
     }
 
     protected void tearDown() throws Exception {

Modified: synapse/trunk/java/modules/transports/src/test/java/org/apache/synapse/transport/UtilsTransportServer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/src/test/java/org/apache/synapse/transport/UtilsTransportServer.java?rev=668011&r1=668010&r2=668011&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/src/test/java/org/apache/synapse/transport/UtilsTransportServer.java (original)
+++ synapse/trunk/java/modules/transports/src/test/java/org/apache/synapse/transport/UtilsTransportServer.java Sun Jun 15 14:32:46 2008
@@ -90,6 +90,7 @@
     
     public void stop() throws Exception {
         listnMgr.stop();
+        listnMgr.destroy();
     }
 
     public void enableAddressing() throws AxisFault {