You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2011/12/16 13:51:56 UTC

svn commit: r1215112 - in /qpid/trunk/qpid/java: broker-plugins/experimental/shutdown/ broker-plugins/experimental/shutdown/src/main/java/org/apache/qpid/shutdown/ broker/src/main/java/org/apache/qpid/server/management/ broker/src/main/java/org/apache/...

Author: kwall
Date: Fri Dec 16 12:51:56 2011
New Revision: 1215112

URL: http://svn.apache.org/viewvc?rev=1215112&view=rev
Log:
QPID-3682: Shutdown Plugin Improvements

Various improvements to shutdown plugin:

1) Give the ShutdownPlugin instance a name to allow it to be permission via ACL METHOD rules.
2) Refactored to extend DefaultManagedObject.
3) Added method/parameter annotations to improve usability from the UI.
4) Fix date format parsing pattern used by the plugin

Applied patch from Andrew MacBean <an...@gmail.com> and myself.

Modified:
    qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/MANIFEST.MF
    qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/build.xml
    qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/src/main/java/org/apache/qpid/shutdown/Activator.java
    qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/src/main/java/org/apache/qpid/shutdown/Shutdown.java
    qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/src/main/java/org/apache/qpid/shutdown/ShutdownMBean.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AMQManagedObject.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/management/DefaultManagedObject.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java

Modified: qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/MANIFEST.MF
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/MANIFEST.MF?rev=1215112&r1=1215111&r2=1215112&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/MANIFEST.MF (original)
+++ qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/MANIFEST.MF Fri Dec 16 12:51:56 2011
@@ -9,7 +9,8 @@ Bundle-Version: 1.0.0
 Bundle-Activator: org.apache.qpid.shutdown.Activator
 Import-Package: javax.management;resolution:=optional,
  org.apache.log4j,
- org.osgi.framework
+ org.osgi.framework,
+ org.apache.qpid.server.management
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ActivationPolicy: lazy
 

Modified: qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/build.xml
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/build.xml?rev=1215112&r1=1215111&r2=1215112&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/build.xml (original)
+++ qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/build.xml Fri Dec 16 12:51:56 2011
@@ -20,7 +20,7 @@
  -->
 <project name="AMQ Broker Shutdown Plugin" default="build">
 
-    <property name="module.depends" value="common broker broker-plugins"/>
+    <property name="module.depends" value="common broker management/common broker-plugins"/>
     <property name="module.test.depends" value="test broker/test management/common client systests"/>
     <property name="module.manifest" value="MANIFEST.MF"/>
     <property name="module.plugin" value="true"/>

Modified: qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/src/main/java/org/apache/qpid/shutdown/Activator.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/src/main/java/org/apache/qpid/shutdown/Activator.java?rev=1215112&r1=1215111&r2=1215112&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/src/main/java/org/apache/qpid/shutdown/Activator.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/src/main/java/org/apache/qpid/shutdown/Activator.java Fri Dec 16 12:51:56 2011
@@ -19,11 +19,6 @@
  */
 package org.apache.qpid.shutdown;
 
-import java.lang.management.ManagementFactory;
-
-import javax.management.InstanceNotFoundException;
-import javax.management.MBeanServer;
-import javax.management.ObjectName;
 
 import org.apache.log4j.Logger;
 import org.osgi.framework.BundleActivator;
@@ -33,20 +28,17 @@ public class Activator implements Bundle
 {
     private static final Logger _logger = Logger.getLogger(Activator.class);
 
-    private static final String SHUTDOWN_MBEAN_NAME = "org.apache.qpid:type=ShutdownMBean";
+    private Shutdown _shutdown = null;
 
     /** @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) */
     public void start(BundleContext ctx) throws Exception {
-        Shutdown shutdown = new Shutdown();
+        _shutdown = new Shutdown();
         if (ctx != null)
         {
-            ctx.registerService(ShutdownMBean.class.getName(), shutdown, null);
+            ctx.registerService(ShutdownMBean.class.getName(), _shutdown, null);
         }
 
-        // MBean registration
-        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
-        ObjectName name = new ObjectName(SHUTDOWN_MBEAN_NAME);
-        mbs.registerMBean(shutdown, name);
+        _shutdown.register();
 
         _logger.info("Shutdown plugin MBean registered");
     }
@@ -54,16 +46,10 @@ public class Activator implements Bundle
     /** @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) */
     public void stop(BundleContext ctx) throws Exception
     {
-        // Unregister MBean
-        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
-        ObjectName name = new ObjectName(SHUTDOWN_MBEAN_NAME);
-        try
-        {
-            mbs.unregisterMBean(name);
-        }
-        catch (InstanceNotFoundException e)
+        if (_shutdown != null)
         {
-            //ignore
+            _shutdown.unregister();
+            _shutdown = null;
         }
 
         _logger.info("Shutdown plugin MBean unregistered");

Modified: qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/src/main/java/org/apache/qpid/shutdown/Shutdown.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/src/main/java/org/apache/qpid/shutdown/Shutdown.java?rev=1215112&r1=1215111&r2=1215112&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/src/main/java/org/apache/qpid/shutdown/Shutdown.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/src/main/java/org/apache/qpid/shutdown/Shutdown.java Fri Dec 16 12:51:56 2011
@@ -27,21 +27,30 @@ import java.util.concurrent.ScheduledExe
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
+import javax.management.NotCompliantMBeanException;
+
 import org.apache.log4j.Logger;
+import org.apache.qpid.server.management.DefaultManagedObject;
 
 /**
  * Implementation of the JMX broker shutdown plugin.
  */
-public class Shutdown implements ShutdownMBean
+public class Shutdown extends DefaultManagedObject implements ShutdownMBean
 {
+
     private static final Logger _logger = Logger.getLogger(Shutdown.class);
 
-    private static final String FORMAT = "yyyyy/MM/dd hh:mm:ss";
+    private static final String FORMAT = "yyyy/MM/dd HH:mm:ss";
     private static final int THREAD_COUNT = 1;
     private static final ScheduledExecutorService EXECUTOR = new ScheduledThreadPoolExecutor(THREAD_COUNT);
 
     private final Runnable _shutdown = new SystemExiter();
 
+    public Shutdown() throws NotCompliantMBeanException
+    {
+        super(ShutdownMBean.class, ShutdownMBean.TYPE);
+    }
+
     /** @see ShutdownMBean#shutdown() */
     public void shutdown()
     {
@@ -50,14 +59,22 @@ public class Shutdown implements Shutdow
     }
 
     /** @see ShutdownMBean#shutdown(long) */
-    public void shutdown(long delay)
+    public void shutdown(final long delay)
     {
-        _logger.info("Scheduled broker shutdown after " + delay + "ms");
-        shutdownBroker(delay);
+        if (delay < 0)
+        {
+            _logger.info("Shutting down at user's request");
+            shutdownBroker(0);
+        }
+        else
+        {
+            _logger.info("Scheduled broker shutdown after " + delay + "ms");
+            shutdownBroker(delay);
+        }
     }
 
     /** @see ShutdownMBean#shutdownAt(String) */
-    public void shutdownAt(String when)
+    public void shutdownAt(final String when)
     {
         Date date;
         DateFormat df = new SimpleDateFormat(FORMAT);
@@ -101,4 +118,13 @@ public class Shutdown implements Shutdow
             System.exit(0);
         }
     }
+
+    /**
+     * @see org.apache.qpid.server.management.ManagedObject#getObjectInstanceName()
+     */
+    @Override
+    public String getObjectInstanceName()
+    {
+        return "Shutdown";
+    }
 }

Modified: qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/src/main/java/org/apache/qpid/shutdown/ShutdownMBean.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/src/main/java/org/apache/qpid/shutdown/ShutdownMBean.java?rev=1215112&r1=1215111&r2=1215112&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/src/main/java/org/apache/qpid/shutdown/ShutdownMBean.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/experimental/shutdown/src/main/java/org/apache/qpid/shutdown/ShutdownMBean.java Fri Dec 16 12:51:56 2011
@@ -19,6 +19,9 @@
  */
 package org.apache.qpid.shutdown;
 
+import org.apache.qpid.management.common.mbeans.annotations.MBeanOperation;
+import org.apache.qpid.management.common.mbeans.annotations.MBeanOperationParameter;
+
 /**
  * Shutdown plugin JMX MBean interface.
  * 
@@ -26,9 +29,12 @@ package org.apache.qpid.shutdown;
  */
 public interface ShutdownMBean
 {
+    static final String TYPE = "Shutdown";
+
     /**
      * Broker will be shut down immediately.
      */
+    @MBeanOperation(name="shutdown", description="Shut down immediately")
     public void shutdown();
 
     /**
@@ -36,12 +42,14 @@ public interface ShutdownMBean
      * 
      * @param delay the number of ms to wait
      */
-    public void shutdown(long delay);
+    @MBeanOperation(name="shutdown", description="Shutdown after the specified delay (ms)")
+    public void shutdown(@MBeanOperationParameter(name="when", description="delay (ms)")long delay);
 
     /**
      * Broker will be shutdown at the specified date and time.
      * 
      * @param when the date and time to shutdown
      */
-    public void shutdownAt(String when);
+    @MBeanOperation(name="shutdownAt", description="Shutdown at the specified date and time (yyyy/MM/dd HH:mm:ss)")
+    public void shutdownAt(@MBeanOperationParameter(name="when", description="shutdown date/time (yyyy/MM/dd HH:mm:ss)")String when);
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AMQManagedObject.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AMQManagedObject.java?rev=1215112&r1=1215111&r2=1215112&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AMQManagedObject.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AMQManagedObject.java Fri Dec 16 12:51:56 2011
@@ -52,8 +52,6 @@ public abstract class AMQManagedObject e
      */
     protected long _notificationSequenceNumber = 0;
 
-    protected MBeanInfo _mbeanInfo;
-
     protected LogActor _logActor;
 
     protected AMQManagedObject(Class<?> managementInterface, String typeName)
@@ -63,27 +61,8 @@ public abstract class AMQManagedObject e
         // CurrentActor will be defined as these objects are created during
         // broker startup.
         _logActor = new ManagementActor(CurrentActor.get().getRootMessageLogger());
-        buildMBeanInfo();
-    }
-
-    @Override
-    public MBeanInfo getMBeanInfo()
-    {
-        return _mbeanInfo;
-    }
-    
-    private void buildMBeanInfo() throws NotCompliantMBeanException
-    {
-        _mbeanInfo = new MBeanInfo(this.getClass().getName(),
-                      MBeanIntrospector.getMBeanDescription(this.getClass()),
-                      MBeanIntrospector.getMBeanAttributesInfo(getManagementInterface()),
-                      MBeanIntrospector.getMBeanConstructorsInfo(this.getClass()),
-                      MBeanIntrospector.getMBeanOperationsInfo(getManagementInterface()),
-                      this.getNotificationInfo());
     }
 
-
-
     // notification broadcaster implementation
 
     public void addNotificationListener(NotificationListener listener,
@@ -99,8 +78,5 @@ public abstract class AMQManagedObject e
         _broadcaster.removeNotificationListener(listener);
     }
 
-    public MBeanNotificationInfo[] getNotificationInfo()
-    {
-        return null;
-    } 
+
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/management/DefaultManagedObject.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/management/DefaultManagedObject.java?rev=1215112&r1=1215111&r2=1215112&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/management/DefaultManagedObject.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/management/DefaultManagedObject.java Fri Dec 16 12:51:56 2011
@@ -21,6 +21,8 @@
 package org.apache.qpid.server.management;
 
 import javax.management.JMException;
+import javax.management.MBeanInfo;
+import javax.management.MBeanNotificationInfo;
 import javax.management.MalformedObjectNameException;
 import javax.management.NotCompliantMBeanException;
 import javax.management.ObjectName;
@@ -28,7 +30,6 @@ import javax.management.StandardMBean;
 
 import org.apache.log4j.Logger;
 import org.apache.qpid.server.registry.ApplicationRegistry;
-import org.apache.qpid.server.registry.IApplicationRegistry;
 
 /**
  * Provides implementation of the boilerplate ManagedObject interface. Most managed objects should find it useful
@@ -37,11 +38,13 @@ import org.apache.qpid.server.registry.I
  */
 public abstract class DefaultManagedObject extends StandardMBean implements ManagedObject
 {
-    private static final Logger LOGGER = Logger.getLogger(ApplicationRegistry.class);
+    private static final Logger LOGGER = Logger.getLogger(DefaultManagedObject.class);
     
-    private Class<?> _managementInterface;
+    private final Class<?> _managementInterface;
 
-    private String _typeName;
+    private final String _typeName;
+
+    private final MBeanInfo _mbeanInfo;
 
     private ManagedObjectRegistry _registry;
 
@@ -51,6 +54,13 @@ public abstract class DefaultManagedObje
         super(managementInterface);
         _managementInterface = managementInterface;
         _typeName = typeName;
+        _mbeanInfo = buildMBeanInfo();
+    }
+
+    @Override
+    public MBeanInfo getMBeanInfo()
+    {
+        return _mbeanInfo;
     }
 
     public String getType()
@@ -98,7 +108,6 @@ public abstract class DefaultManagedObje
         return getObjectInstanceName() + "[" + getType() + "]";
     }
 
-
     /**
      * Created the ObjectName as per the JMX Specs
      * @return ObjectName
@@ -161,4 +170,18 @@ public abstract class DefaultManagedObje
             return "";
     }
 
+    private MBeanInfo buildMBeanInfo() throws NotCompliantMBeanException
+    {
+        return new MBeanInfo(this.getClass().getName(),
+                      MBeanIntrospector.getMBeanDescription(this.getClass()),
+                      MBeanIntrospector.getMBeanAttributesInfo(getManagementInterface()),
+                      MBeanIntrospector.getMBeanConstructorsInfo(this.getClass()),
+                      MBeanIntrospector.getMBeanOperationsInfo(getManagementInterface()),
+                      this.getNotificationInfo());
+    }
+
+    public MBeanNotificationInfo[] getNotificationInfo()
+    {
+        return null;
+    }
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java?rev=1215112&r1=1215111&r2=1215112&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java Fri Dec 16 12:51:56 2011
@@ -250,14 +250,14 @@ public abstract class ApplicationRegistr
 
         try
         {
+            initialiseManagedObjectRegistry();
+
             configure();
 
             _qmfService = new QMFService(getConfigStore(), this);
 
             CurrentActor.get().message(BrokerMessages.STARTUP(QpidProperties.getReleaseVersion(), QpidProperties.getBuildVersion()));
 
-            initialiseManagedObjectRegistry();
-
             _virtualHostRegistry = new VirtualHostRegistry(this);
 
             _securityManager = new SecurityManager(_configuration, _pluginManager);
@@ -471,12 +471,12 @@ public abstract class ApplicationRegistr
 
         close(_authenticationManager);
 
-        close(_managedObjectRegistry);
-
         close(_qmfService);
 
         close(_pluginManager);
 
+        close(_managedObjectRegistry);
+
         CurrentActor.get().message(BrokerMessages.STOPPED());
     }
 



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org