Author: jlmonteiro
Date: Tue Oct  1 22:59:35 2013
New Revision: 1528259

URL: http://svn.apache.org/r1528259
Log:
Adding REST resources to JMX

Modified:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/monitoring/LocalMBeanServer.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoTransactionManagerFactory.java
    
tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/monitoring/LocalMBeanServer.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/monitoring/LocalMBeanServer.java?rev=1528259&r1=1528258&r2=1528259&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/monitoring/LocalMBeanServer.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/monitoring/LocalMBeanServer.java
 Tue Oct  1 22:59:35 2013
@@ -98,6 +98,15 @@ public class LocalMBeanServer implements
         return registerSilently(new DynamicMBeanWrapper(object), name);
     }
 
+    public static void unregisterSilently(final ObjectName name) {
+        try {
+            get().unregisterMBean(name);
+
+        } catch (Exception e) {
+            LOGGER.error("Cannot unregister MBean " + name, e);
+        }
+    }
+
     public static TabularData tabularData(String typeName, String 
typeDescription, String[] names, Object[] values) {
         if (names.length == 0) {
             return null;

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoTransactionManagerFactory.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoTransactionManagerFactory.java?rev=1528259&r1=1528258&r2=1528259&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoTransactionManagerFactory.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoTransactionManagerFactory.java
 Tue Oct  1 22:59:35 2013
@@ -28,6 +28,7 @@ import org.apache.openejb.api.internal.I
 import org.apache.openejb.api.jmx.Description;
 import org.apache.openejb.api.jmx.MBean;
 import org.apache.openejb.api.jmx.ManagedAttribute;
+import org.apache.openejb.api.jmx.ManagedOperation;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.monitoring.LocalMBeanServer;
 import org.apache.openejb.monitoring.ObjectNameBuilder;
@@ -105,7 +106,9 @@ public class GeronimoTransactionManagerF
         final GeronimoTransactionManager geronimoTransactionManager = new 
GeronimoTransactionManager(defaultTransactionTimeoutSeconds, xidFactory, txLog);
         final ObjectNameBuilder jmxName = new 
ObjectNameBuilder("openejb.management")
                 .set("j2eeType", "TransactionManager");
-        LocalMBeanServer.registerDynamicWrapperSilently(new 
TransactionManagerMBean(geronimoTransactionManager), jmxName.build());
+        LocalMBeanServer.registerDynamicWrapperSilently(
+                new TransactionManagerMBean(geronimoTransactionManager, 
defaultTransactionTimeout, txLog),
+                jmxName.build());
 
         return geronimoTransactionManager;
     }
@@ -122,9 +125,13 @@ public class GeronimoTransactionManagerF
     public static final class TransactionManagerMBean {
 
         private final GeronimoTransactionManager transactionManager;
+        private final Duration defaultTransactionTimeout;
+        private final TransactionLog txLog;
 
-        public TransactionManagerMBean(final GeronimoTransactionManager 
transactionManager) {
+        public TransactionManagerMBean(final GeronimoTransactionManager 
transactionManager, final Duration defaultTransactionTimeout, final 
TransactionLog txLog) {
             this.transactionManager = transactionManager;
+            this.defaultTransactionTimeout = defaultTransactionTimeout;
+            this.txLog = txLog;
         }
 
         @ManagedAttribute
@@ -132,18 +139,30 @@ public class GeronimoTransactionManagerF
         public long getActive() {
             return transactionManager.getActiveCount();
         }
+
         @ManagedAttribute
         @Description("Number of committed transactions")
         public long getCommits() {
             return transactionManager.getTotalCommits();
         }
+
         @ManagedAttribute
         @Description("Number of rolled back transactions")
         public long getRollbacks() {
             return transactionManager.getTotalRollbacks();
         }
 
+        @ManagedOperation
+        @Description("Reset statistics counters")
+        public void resetStatistics() {
+            transactionManager.resetStatistics();
+        }
 
+        @ManagedAttribute
+        @Description("Display the default transaction timeout")
+        public String getDefaultTransactionTimeout() {
+            return defaultTransactionTimeout.toString();
+        }
 
     }
 

Modified: 
tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java?rev=1528259&r1=1528258&r2=1528259&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
 Tue Oct  1 22:59:35 2013
@@ -35,10 +35,16 @@ import org.apache.cxf.transport.http.HTT
 import org.apache.cxf.transport.servlet.BaseUrlHelper;
 import org.apache.openejb.BeanContext;
 import org.apache.openejb.Injection;
+import org.apache.openejb.api.internal.Internal;
+import org.apache.openejb.api.jmx.Description;
+import org.apache.openejb.api.jmx.MBean;
+import org.apache.openejb.api.jmx.ManagedAttribute;
 import org.apache.openejb.assembler.classic.ServiceInfo;
 import org.apache.openejb.assembler.classic.util.ServiceConfiguration;
 import org.apache.openejb.assembler.classic.util.ServiceInfos;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.monitoring.LocalMBeanServer;
+import org.apache.openejb.monitoring.ObjectNameBuilder;
 import org.apache.openejb.rest.ThreadLocalContextManager;
 import org.apache.openejb.server.cxf.transport.util.CxfUtil;
 import org.apache.openejb.server.httpd.HttpRequest;
@@ -51,6 +57,8 @@ import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.proxy.ProxyEJB;
 import org.apache.webbeans.config.WebBeansContext;
 
+import javax.management.ObjectName;
+import javax.management.openmbean.TabularData;
 import javax.naming.Context;
 import javax.servlet.ServletException;
 import javax.servlet.ServletOutputStream;
@@ -94,6 +102,7 @@ public class CxfRsHttpListener implement
     private Server server;
     private String context = "";
     private Collection<Pattern> staticResourcesList = new 
CopyOnWriteArrayList<Pattern>();
+    private List<ObjectName> jmxNames = new ArrayList<ObjectName>();
 
     static {
         STATIC_CONTENT_TYPES = new HashMap<String, String>();
@@ -294,6 +303,12 @@ public class CxfRsHttpListener implement
     }
 
     public void undeploy() {
+        // unregister all MBeans
+        for (final ObjectName objectName : jmxNames) {
+            LocalMBeanServer.unregisterSilently(objectName);
+        }
+
+
         final ClassLoader oldLoader = 
Thread.currentThread().getContextClassLoader();
         Thread.currentThread().setContextClassLoader(CxfUtil.initBusLoader());
         try {
@@ -433,7 +448,23 @@ public class CxfRsHttpListener implement
         LOGGER.info("REST Application: " + Logs.forceLength(prefix, 
addressSize, true) + " -> " + application.getClass().getName());
 
         Collections.sort(resourcesToLog);
+
         for (Logs.LogResourceEndpointInfo resource : resourcesToLog) {
+
+            // Init and register MBeans
+            final ObjectNameBuilder jmxName = new 
ObjectNameBuilder("openejb.management")
+                    .set("J2EEServer", "openejb")
+                    .set("name", resource.classname)
+                    .set("j2eeType", "REST-" + resource.type);
+
+            ObjectName jmxObjectName = jmxName.build();
+            LocalMBeanServer.registerDynamicWrapperSilently(
+                    new RestServiceMBean(resource),
+                    jmxObjectName);
+
+            jmxNames.add(jmxObjectName);
+            //
+
             LOGGER.info("     Service URI: "
                     + Logs.forceLength(resource.address, addressSize, true) + 
" -> "
                     + Logs.forceLength(resource.type, 4, false) + " "
@@ -591,4 +622,60 @@ public class CxfRsHttpListener implement
             return clazz.newInstance();
         }
     }
+
+    @MBean
+    @Internal
+    @Description("REST service information")
+    public class RestServiceMBean {
+
+        private String type;
+        private String address;
+        private String classname;
+        private TabularData operations;
+
+        public RestServiceMBean(final Logs.LogResourceEndpointInfo jmxName) {
+            this.type = jmxName.type;
+            this.address = jmxName.address;
+            this.classname = jmxName.classname;
+
+            final String[] names = new String[operations.size()];
+            final String[] values = new String[operations.size()];
+            int idx = 0;
+            for (Logs.LogOperationEndpointInfo operation : jmxName.operations) 
{
+                names[idx] = Logs.forceLength(operation.http, 
jmxName.methodSize, false) + " "
+                        + Logs.forceLength(operation.address, 
operation.address.length(), true);
+                values[idx] = Logs.forceLength(operation.method, 
jmxName.methodStrSize, true);
+                idx++;
+            }
+            LocalMBeanServer.tabularData(
+                    "Operations",
+                    "Operations for this endpoint",
+                    names, values
+            );
+        }
+
+        @ManagedAttribute
+        @Description("The type of the REST service")
+        public String getType() {
+            return type;
+        }
+
+        @ManagedAttribute
+        @Description("The REST service address")
+        public String getAddress() {
+            return address;
+        }
+
+        @ManagedAttribute
+        @Description("The REST service class name")
+        public String getClassname() {
+            return classname;
+        }
+
+        @ManagedAttribute
+        @Description("All available methods")
+        public TabularData getOperations() {
+            return operations;
+        }
+    }
 }


Reply via email to