Java/J2EE/JMX

Материал из Java эксперт
Перейти к: навигация, поиск

Create the Hello MBean and QueueSampler MXBean, register them in the platform MBean server

   <source lang="java">

/*

* Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
*   - Redistributions of source code must retain the above copyright
*     notice, this list of conditions and the following disclaimer.
*
*   - Redistributions in binary form must reproduce the above copyright
*     notice, this list of conditions and the following disclaimer in the
*     documentation and/or other materials provided with the distribution.
*
*   - Neither the name of Sun Microsystems nor the names of its
*     contributors may be used to endorse or promote products derived
*     from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/*

* Main.java - main class for the Hello MBean and QueueSampler MXBean example.
* Create the Hello MBean and QueueSampler MXBean, register them in the platform
* MBean server, then wait forever (or until the program is interrupted).
*/

import java.beans.ConstructorProperties; import java.lang.management.ManagementFactory; import java.util.Date; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import javax.management.AttributeChangeNotification; import javax.management.MBeanNotificationInfo; import javax.management.MBeanServer; import javax.management.Notification; import javax.management.NotificationBroadcasterSupport; import javax.management.ObjectName; public class Main {

 /*
  * For simplicity, we declare "throws Exception". Real programs will usually
  * want finer-grained exception handling.
  */
 public static void main(String[] args) throws Exception {
   // Get the Platform MBean Server
   MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
   // Construct the ObjectName for the Hello MBean we will register
   ObjectName mbeanName = new ObjectName("com.example:type=Hello");
   // Create the Hello World MBean
   Hello mbean = new Hello();
   // Register the Hello World MBean
   mbs.registerMBean(mbean, mbeanName);
   // Construct the ObjectName for the QueueSampler MXBean we will register
   ObjectName mxbeanName = new ObjectName("com.example:type=QueueSampler");
   // Create the Queue Sampler MXBean
   Queue<String> queue = new ArrayBlockingQueue<String>(10);
   queue.add("Request-1");
   queue.add("Request-2");
   queue.add("Request-3");
   QueueSampler mxbean = new QueueSampler(queue);
   // Register the Queue Sampler MXBean
   mbs.registerMBean(mxbean, mxbeanName);
   // Wait forever
   System.out.println("Waiting for incoming requests...");
   Thread.sleep(Long.MAX_VALUE);
 }

} /*

* QueueSample.java - Java type representing a snapshot of a given queue. It
* bundles together the instant time the snapshot was taken, the queue size and
* the queue head.
*/

interface QueueSamplerMXBean {

 public QueueSample getQueueSample();
 public void clearQueue();

} class QueueSample {

 private final Date date;
 private final int size;
 private final String head;
 @ConstructorProperties( { "date", "size", "head" })
 public QueueSample(Date date, int size, String head) {
   this.date = date;
   this.size = size;
   this.head = head;
 }
 public Date getDate() {
   return date;
 }
 public int getSize() {
   return size;
 }
 public String getHead() {
   return head;
 }

} /*

* Hello.java - MBean implementation for the Hello MBean. This class must
* implement all the Java methods declared in the HelloMBean interface, with the
* appropriate behavior for each one.
*/

class QueueSampler implements QueueSamplerMXBean {

 private Queue<String> queue;
 public QueueSampler(Queue<String> queue) {
   this.queue = queue;
 }
 public QueueSample getQueueSample() {
   synchronized (queue) {
     return new QueueSample(new Date(), queue.size(), queue.peek());
   }
 }
 public void clearQueue() {
   synchronized (queue) {
     queue.clear();
   }
 }

}/*

  * HelloMBean.java - MBean interface describing the management operations and
  * attributes for the Hello World MBean. In this case there are two
  * operations, "sayHello" and "add", and two attributes, "Name" and
  * "CacheSize".
  */

interface HelloMBean {

 // -----------
 // operations
 // -----------
 public void sayHello();
 public int add(int x, int y);
 // -----------
 // attributes
 // -----------
 // a read-only attribute called Name of type String
 public String getName();
 // a read-write attribute called CacheSize of type int
 public int getCacheSize();
 public void setCacheSize(int size);

} class Hello extends NotificationBroadcasterSupport implements HelloMBean {

 public void sayHello() {
   System.out.println("hello, world");
 }
 public int add(int x, int y) {
   return x + y;
 }
 /*
  * Getter for the Name attribute. The pattern shown here is frequent: the
  * getter returns a private field representing the attribute value. In our
  * case, the attribute value never changes, but for other attributes it might
  * change as the application runs. Consider an attribute representing
  * statistics such as uptime or memory usage, for example. Being read-only
  * just means that it can"t be changed through the management interface.
  */
 public String getName() {
   return this.name;
 }
 /*
  * Getter for the CacheSize attribute. The pattern shown here is frequent: the
  * getter returns a private field representing the attribute value, and the
  * setter changes that field.
  */
 public int getCacheSize() {
   return this.cacheSize;
 }
 /*
  * Setter for the CacheSize attribute. To avoid problems with stale values in
  * multithreaded situations, it is a good idea for setters to be synchronized.
  */
 public synchronized void setCacheSize(int size) {
   int oldSize = this.cacheSize;
   this.cacheSize = size;
   /*
    * In a real application, changing the attribute would typically have
    * effects beyond just modifying the cacheSize field. For example, resizing
    * the cache might mean discarding entries or allocating new ones. The logic
    * for these effects would be here.
    */
   System.out.println("Cache size now " + this.cacheSize);
   /*
    * Construct a notification that describes the change. The "source" of a
    * notification is the ObjectName of the MBean that emitted it. But an MBean
    * can put a reference to itself ("this") in the source, and the MBean
    * server will replace this with the ObjectName before sending the
    * notification on to its clients.
    * 
    * For good measure, we maintain a sequence number for each notification
    * emitted by this MBean.
    * 
    * The oldValue and newValue parameters to the constructor are of type
    * Object, so we are relying on Tiger"s autoboxing here.
    */
   Notification n = new AttributeChangeNotification(this, sequenceNumber++,
       System.currentTimeMillis(), "CacheSize changed", "CacheSize", "int",
       oldSize, this.cacheSize);
   /*
    * Now send the notification using the sendNotification method inherited
    * from the parent class NotificationBroadcasterSupport.
    */
   sendNotification(n);
 }
 @Override
 public MBeanNotificationInfo[] getNotificationInfo() {
   String[] types = new String[] { AttributeChangeNotification.ATTRIBUTE_CHANGE };
   String name = AttributeChangeNotification.class.getName();
   String description = "An attribute of this MBean has changed";
   MBeanNotificationInfo info = new MBeanNotificationInfo(types, name,
       description);
   return new MBeanNotificationInfo[] { info };
 }
 private final String name = "Reginald";
 private int cacheSize = DEFAULT_CACHE_SIZE;
 private static final int DEFAULT_CACHE_SIZE = 200;
 private long sequenceNumber = 1;

}

</source>
   
  
 
  



how failure to supply an appropriate authentication mechanism results in a failure to create an initial context

   <source lang="java">

/*

* Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
*   - Redistributions of source code must retain the above copyright
*     notice, this list of conditions and the following disclaimer.
*
*   - Redistributions in binary form must reproduce the above copyright
*     notice, this list of conditions and the following disclaimer in the
*     documentation and/or other materials provided with the distribution.
*
*   - Neither the name of Sun Microsystems nor the names of its
*     contributors may be used to endorse or promote products derived
*     from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; /**

* Demonstrates how failure to supply an appropriate authentication mechanism
* results in a failure to create an initial context
* 
* usage: java BadAuth
*/

class BadAuth {

 public static void main(String[] args) {
   // Set up environment for creating initial context
   Hashtable<String, Object> env = new Hashtable<String, Object>(11);
   env
       .put(Context.INITIAL_CONTEXT_FACTORY,
           "com.sun.jndi.ldap.LdapCtxFactory");
   env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial");
   // Authenticate as S. User and password "mysecret"
   env.put(Context.SECURITY_AUTHENTICATION, "custom");
   env.put(Context.SECURITY_PRINCIPAL,
       "cn=S. User, ou=NewHires, o=JNDITutorial");
   env.put(Context.SECURITY_CREDENTIALS, "mysecret");
   try {
     // Create initial context
     DirContext ctx = new InitialDirContext(env);
     System.out.println(ctx.lookup("ou=NewHires"));
     // do something useful with ctx
     // Close the context when we"re done
     ctx.close();
   } catch (NamingException e) {
     e.printStackTrace();
   }
 }

}

</source>
   
  
 
  



JMX client

   <source lang="java">

/*

* @(#)SimpleClient.java  1.2 05/08/08
*
* Copyright (c) 2000-2005 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/

import javax.management.*; import javax.management.remote.*; import com.sun.messaging.AdminConnectionFactory; import com.sun.messaging.jms.management.server.MQObjectName; import com.sun.messaging.jms.management.server.BrokerAttributes; public class SimpleClient {

   public static void main(String[] args) {
 try  {
     AdminConnectionFactory acf;
     /*
      * Create admin connection factory and connect to JMX Connector
      * server using administrator username/password.
      * A JMX connector client object is obtained from this.
      */
     acf = new AdminConnectionFactory();
     JMXConnector jmxc = acf.createConnection("admin","admin");
     /*
      * Get MBeanServer interface.
      */
     MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
     /*
      * Create object name of broker config MBean.
      */
     ObjectName objName
   = new ObjectName(MQObjectName.BROKER_MONITOR_MBEAN_NAME);
     /*
      * Get attributes:
      *  InstanceName
      *  Version
      */
     System.out.println("Broker Instance Name = " +
        mbsc.getAttribute(objName, BrokerAttributes.INSTANCE_NAME));
     System.out.println("Broker Version = " +
        mbsc.getAttribute(objName, BrokerAttributes.VERSION));
     jmxc.close();
 } catch (Exception e)  {
     e.printStackTrace();
 }
   }

}

       </source>
   
  
 
  



JMX client that interacts with the JMX agent

   <source lang="java">

/*

* Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
*   - Redistributions of source code must retain the above copyright
*     notice, this list of conditions and the following disclaimer.
*
*   - Redistributions in binary form must reproduce the above copyright
*     notice, this list of conditions and the following disclaimer in the
*     documentation and/or other materials provided with the distribution.
*
*   - Neither the name of Sun Microsystems nor the names of its
*     contributors may be used to endorse or promote products derived
*     from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/*

* Client.java - JMX client that interacts with the JMX agent. It gets
* attributes and performs operations on the Hello MBean and the QueueSampler
* MXBean example. It also listens for Hello MBean notifications.
*/

import java.beans.ConstructorProperties; import java.io.IOException; import java.util.Arrays; import java.util.Date; import java.util.Set; import java.util.TreeSet; import javax.management.AttributeChangeNotification; import javax.management.JMX; import javax.management.MBeanServerConnection; import javax.management.Notification; import javax.management.NotificationListener; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; public class Client {

 /**
  * Inner class that will handle the notifications.
  */
 public static class ClientListener implements NotificationListener {
   public void handleNotification(Notification notification, Object handback) {
     echo("\nReceived notification:");
     echo("\tClassName: " + notification.getClass().getName());
     echo("\tSource: " + notification.getSource());
     echo("\tType: " + notification.getType());
     echo("\tMessage: " + notification.getMessage());
     if (notification instanceof AttributeChangeNotification) {
       AttributeChangeNotification acn = (AttributeChangeNotification) notification;
       echo("\tAttributeName: " + acn.getAttributeName());
       echo("\tAttributeType: " + acn.getAttributeType());
       echo("\tNewValue: " + acn.getNewValue());
       echo("\tOldValue: " + acn.getOldValue());
     }
   }
 }
 /*
  * For simplicity, we declare "throws Exception". Real programs will usually
  * want finer-grained exception handling.
  */
 public static void main(String[] args) throws Exception {
   // Create an RMI connector client and
   // connect it to the RMI connector server
   //
   echo("\nCreate an RMI connector client and "
       + "connect it to the RMI connector server");
   JMXServiceURL url = new JMXServiceURL(
       "service:jmx:rmi:///jndi/rmi://:9999/jmxrmi");
   JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
   // Create listener
   //
   ClientListener listener = new ClientListener();
   // Get an MBeanServerConnection
   //
   echo("\nGet an MBeanServerConnection");
   MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
   waitForEnterPressed();
   // Get domains from MBeanServer
   //
   echo("\nDomains:");
   String domains[] = mbsc.getDomains();
   Arrays.sort(domains);
   for (String domain : domains) {
     echo("\tDomain = " + domain);
   }
   waitForEnterPressed();
   // Get MBeanServer"s default domain
   //
   echo("\nMBeanServer default domain = " + mbsc.getDefaultDomain());
   // Get MBean count
   //
   echo("\nMBean count = " + mbsc.getMBeanCount());
   // Query MBean names
   //
   echo("\nQuery MBeanServer MBeans:");
   Set<ObjectName> names = new TreeSet<ObjectName>(mbsc.queryNames(null, null));
   for (ObjectName name : names) {
     echo("\tObjectName = " + name);
   }
   waitForEnterPressed();
   // ----------------------
   // Manage the Hello MBean
   // ----------------------
   echo("\n>>> Perform operations on Hello MBean <<<");
   // Construct the ObjectName for the Hello MBean
   //
   ObjectName mbeanName = new ObjectName("com.example:type=Hello");
   // Create a dedicated proxy for the MBean instead of
   // going directly through the MBean server connection
   //
   HelloMBean mbeanProxy = JMX.newMBeanProxy(mbsc, mbeanName,
       HelloMBean.class, true);
   // Add notification listener on Hello MBean
   //
   echo("\nAdd notification listener...");
   mbsc.addNotificationListener(mbeanName, listener, null, null);
   // Get CacheSize attribute in Hello MBean
   //
   echo("\nCacheSize = " + mbeanProxy.getCacheSize());
   // Set CacheSize attribute in Hello MBean
   // Calling "reset" makes the Hello MBean emit a
   // notification that will be received by the registered
   // ClientListener.
   //
   mbeanProxy.setCacheSize(150);
   // Sleep for 2 seconds to have time to receive the notification
   //
   echo("\nWaiting for notification...");
   sleep(2000);
   // Get CacheSize attribute in Hello MBean
   //
   echo("\nCacheSize = " + mbeanProxy.getCacheSize());
   // Invoke "sayHello" in Hello MBean
   //
   echo("\nInvoke sayHello() in Hello MBean...");
   mbeanProxy.sayHello();
   // Invoke "add" in Hello MBean
   //
   echo("\nInvoke add(2, 3) in Hello MBean...");
   echo("\nadd(2, 3) = " + mbeanProxy.add(2, 3));
   waitForEnterPressed();
   // ------------------------------
   // Manage the QueueSampler MXBean
   // ------------------------------
   echo("\n>>> Perform operations on QueueSampler MXBean <<<");
   // Construct the ObjectName for the QueueSampler MXBean
   //
   ObjectName mxbeanName = new ObjectName("com.example:type=QueueSampler");
   // Create a dedicated proxy for the MXBean instead of
   // going directly through the MBean server connection
   //
   QueueSamplerMXBean mxbeanProxy = JMX.newMXBeanProxy(mbsc, mxbeanName,
       QueueSamplerMXBean.class);
   // Get QueueSample attribute in QueueSampler MXBean
   //
   QueueSample queue1 = mxbeanProxy.getQueueSample();
   echo("\nQueueSample.Date = " + queue1.getDate());
   echo("QueueSample.Head = " + queue1.getHead());
   echo("QueueSample.Size = " + queue1.getSize());
   // Invoke "clearQueue" in QueueSampler MXBean
   //
   echo("\nInvoke clearQueue() in QueueSampler MXBean...");
   mxbeanProxy.clearQueue();
   // Get QueueSample attribute in QueueSampler MXBean
   //
   QueueSample queue2 = mxbeanProxy.getQueueSample();
   echo("\nQueueSample.Date = " + queue2.getDate());
   echo("QueueSample.Head = " + queue2.getHead());
   echo("QueueSample.Size = " + queue2.getSize());
   waitForEnterPressed();
   // Close MBeanServer connection
   //
   echo("\nClose the connection to the server");
   jmxc.close();
   echo("\nBye! Bye!");
 }
 private static void echo(String msg) {
   System.out.println(msg);
 }
 private static void sleep(int millis) {
   try {
     Thread.sleep(millis);
   } catch (InterruptedException e) {
     e.printStackTrace();
   }
 }
 private static void waitForEnterPressed() {
   try {
     echo("\nPress <Enter> to continue...");
     System.in.read();
   } catch (IOException e) {
     e.printStackTrace();
   }
 }

} /*

* HelloMBean.java - MBean interface describing the management operations and
* attributes for the Hello World MBean. In this case there are two operations,
* "sayHello" and "add", and two attributes, "Name" and "CacheSize".
*/

interface HelloMBean {

 // -----------
 // operations
 // -----------
 public void sayHello();
 public int add(int x, int y);
 // -----------
 // attributes
 // -----------
 // a read-only attribute called Name of type String
 public String getName();
 // a read-write attribute called CacheSize of type int
 public int getCacheSize();
 public void setCacheSize(int size);

} /*

* QueueSample.java - Java type representing a snapshot of a given queue. It
* bundles together the instant time the snapshot was taken, the queue size and
* the queue head.
*/

interface QueueSamplerMXBean {

 public QueueSample getQueueSample();
 public void clearQueue();

} class QueueSample {

 private final Date date;
 private final int size;
 private final String head;
 @ConstructorProperties( { "date", "size", "head" })
 public QueueSample(Date date, int size, String head) {
   this.date = date;
   this.size = size;
   this.head = head;
 }
 public Date getDate() {
   return date;
 }
 public int getSize() {
   return size;
 }
 public String getHead() {
   return head;
 }

}

</source>
   
  
 
  



JMX (Java Management Extensions): scan directory

List JMX destination

   <source lang="java">

/*

* @(#)ListDestinations.java  1.5 05/08/23
*
* Copyright (c) 2000-2005 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/

import javax.management.*; import javax.management.remote.*; import com.sun.messaging.AdminConnectionFactory; import com.sun.messaging.jms.management.server.MQObjectName; import com.sun.messaging.jms.management.server.DestinationAttributes; import com.sun.messaging.jms.management.server.DestinationOperations; public class ListDestinations {

   public static void main(String[] args) {
 try  {
     AdminConnectionFactory acf;
     /*
      * Create admin connection factory and connect to JMX Connector
      * server using administrator username/password.
      * A JMX connector client object is obtained from this.
      */
     acf = new AdminConnectionFactory();
     JMXConnector jmxc = acf.createConnection("admin", "admin");
     /*
      * Get MBeanServer interface.
      */
     MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
     /*
      * Create object name of destination monitor mgr MBean.
      */
     ObjectName objName
   = new ObjectName(MQObjectName.DESTINATION_MANAGER_MONITOR_MBEAN_NAME);
     ObjectName destinationObjNames[] = 
               (ObjectName[])mbsc.invoke(objName, DestinationOperations.GET_DESTINATIONS, null, null);
           System.out.println("Listing destinations:" );
     for (int i = 0; i < destinationObjNames.length; ++i)  {
   ObjectName oneDestObjName = destinationObjNames[i];
   System.out.println("\tName: " + 
       mbsc.getAttribute(oneDestObjName, DestinationAttributes.NAME));
   System.out.println("\tType: " + 
       mbsc.getAttribute(oneDestObjName, DestinationAttributes.TYPE));
   System.out.println("\tState: " + 
       mbsc.getAttribute(oneDestObjName, DestinationAttributes.STATE_LABEL));
   System.out.println("");
     }
     jmxc.close();
 } catch (Exception e)  {
     e.printStackTrace();
 }
   }

}

       </source>
   
  
 
  



MQ log

   <source lang="java">

/*

* @(#)MQLogViewer.java  1.4 05/08/08
*
* Copyright (c) 2000-2005 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.StringTokenizer; import javax.management.*; import javax.management.remote.*; import com.sun.messaging.AdminConnectionFactory; import com.sun.messaging.AdminConnectionConfiguration; import com.sun.messaging.jms.management.server.*;

public class MQLogViewer implements ActionListener,

       NotificationListener {
   JFrame f;
   MQConnectDialog connectDialog = null;
   JMenuItem exit, connect, disconnect, clearLog;
   JCheckBoxMenuItem  info, warning, error;
   JTextArea logMsgArea, statusTextArea;
   JLabel brokerAddress;
   String address = null, adminUser = "admin", adminPasswd = "admin";
   String  logLevelStrings[] = { LogLevel.INFO, 
         LogLevel.WARNING, 
         LogLevel.ERROR };
   AdminConnectionFactory acf;
   JMXConnector jmxc;
   MBeanServerConnection mbsc;
   ObjectName  logCfg = null;
   NotificationFilterSupport myFilter = null;
   public MQLogViewer(JFrame f, String address, 
     String adminUser, String adminPasswd) {
 this.f = f;
 this.address = address;
 this.adminUser = adminUser;
 this.adminPasswd = adminPasswd;
 try  {
     logCfg = new ObjectName(MQObjectName.LOG_MONITOR_MBEAN_NAME);
 } catch (Exception e)  {
     addStatusText("Caught exception while creating Log MBean ObjectName: " + e);
 }
 initGUI();
 if ((address != null) && (adminUser != null) && (adminPasswd != null))  {
     doConnect();
 }
   }
   private void initGUI()  {
 JMenuBar menubar = createMenubar();
 JComponent toolbar = createToolBar();
 JPanel mainPanel = createMainPanel();
 JPanel statusArea = createStatusArea();
 f.setJMenuBar(menubar);
 f.getContentPane().add(toolbar, BorderLayout.NORTH);
 f.getContentPane().add(mainPanel, BorderLayout.CENTER);
 f.getContentPane().add(statusArea, BorderLayout.SOUTH);
   }
   public void logMessage(LogNotification n) {
       logMsgArea.append(n.getMessage());
       logMsgArea.setCaretPosition(logMsgArea.getText().length());
   }
   public void clearLogArea()  {
       logMsgArea.setText("");
   }
   public void addStatusText(String statusText) {
       statusTextArea.append(statusText);
       statusTextArea.setCaretPosition(statusTextArea.getText().length());
       statusTextArea.append("\n");
   }
   public void clearStatus()  {
       statusTextArea.setText("");
   }
   public void doConnect()  {
 try  {
     acf = new AdminConnectionFactory();
     if (address != null)  {
         acf.setProperty(AdminConnectionConfiguration.imqAddress,
       address);
     }
     jmxc = acf.createConnection(adminUser, adminPasswd);
     jmxc.addConnectionNotificationListener(this, null, null);
     mbsc = jmxc.getMBeanServerConnection();
     addStatusText("Connected to broker at: " 
   + acf.getProperty(AdminConnectionConfiguration.imqAddress));
     
     brokerAddress.setText(
   acf.getProperty(AdminConnectionConfiguration.imqAddress));
     logOn();
     connect.setEnabled(false);
     disconnect.setEnabled(true);
 } catch (Exception e)  {
     addStatusText("Caught exception while connecting: " + e);
 }
   }
   public void doDisconnect()  {
 try  {
     logOff();
     addStatusText("Disconnecting from broker at: " 
   + acf.getProperty(AdminConnectionConfiguration.imqAddress));
     brokerAddress.setText("<none>");
     if (jmxc != null)  {
   jmxc.close();
     }
     jmxc = null;
     mbsc = null;
     acf = null;
     connect.setEnabled(true);
     disconnect.setEnabled(false);
     clearLogArea();
 } catch (Exception e)  {
     addStatusText("Caught exception while disconnecting: " + e);
 }
   }
   public void logOff()  {
 if (myFilter != null)  {
     try  {
   if (mbsc != null)  {
             mbsc.removeNotificationListener(logCfg, this, myFilter, null);
   }
   myFilter = null;
         addStatusText("Unregistered log listener");
     } catch(Exception e)  {
         addStatusText("Caught exception while removing log listener: " + e);
     }
 }
   }
   public void logOn()  {
 String logLevels = getLogLevel();
 logOff();
 if (logLevels.equals(""))  {
     addStatusText("No log levels selected.");
     return;
 }
 myFilter = new NotificationFilterSupport();
 StringTokenizer st = new StringTokenizer(logLevels, "|");
 while (st.hasMoreTokens()) {
     String oneLevel = st.nextToken();
     myFilter.enableType(LogNotification.LOG_LEVEL_PREFIX + oneLevel);
 }
 try  {
     mbsc.addNotificationListener(logCfg, this, myFilter, null);
     addStatusText("Registered listener at log levels: " + logLevels);
 } catch(Exception e)  {
     addStatusText("Caught exception while addind log listener: " + e);
 }
   }
   public String getLogLevel()  {
 String s = null;
 if (info.getState())  {
     s = info.getText();
 }
 if (warning.getState())  {
     if (s == null)  {
         s = warning.getText();
     } else  {
   s = s + "|" + warning.getText();
     }
 }
 if (error.getState())  {
     if (s == null)  {
         s = error.getText();
     } else  {
   s = s + "|" + error.getText();
     }
 }
 if (s == null)  {
     return ("");
 }
 return (s);
   }
   public void handleNotification(Notification notification, Object handback)  {
 if (notification instanceof LogNotification)  {
           logMessage((LogNotification)notification);
 } else if (notification instanceof JMXConnectionNotification)  {
     JMXConnectionNotification jcn = (JMXConnectionNotification)notification;
     /*
      * TBD: handle server shutdown
      */
     if (jcn.getType().equals(JMXConnectionNotification.CLOSED) ||
        jcn.getType().equals(JMXConnectionNotification.FAILED))  {
     }
 }
   }
   private JMenuBar createMenubar()  {
 JMenuBar menubar;
 JMenu menu, logLevelMenu;
 menubar = new JMenuBar();
 menu = new JMenu("LogViewer");
 logLevelMenu = new JMenu("Log Levels");
 menubar.add(menu);
 menubar.add(logLevelMenu);
 connect = new JMenuItem("Connect");
 connect.addActionListener(this);
 menu.add(connect);
 disconnect = new JMenuItem("Disconnect");
 disconnect.addActionListener(this);
 disconnect.setEnabled(false);
 menu.add(disconnect);
 menu.addSeparator();
 clearLog = new JMenuItem("Clear Log Display");
 clearLog.addActionListener(this);
 menu.add(clearLog);
 menu.addSeparator();
 exit = new JMenuItem("Exit");
 exit.addActionListener(this);
 menu.add(exit);
 info = new JCheckBoxMenuItem(LogLevel.INFO);
 info.addActionListener(this);
 info.setState(true);
 logLevelMenu.add(info);
 warning = new JCheckBoxMenuItem(LogLevel.WARNING);
 warning.addActionListener(this);
 warning.setState(true);
 logLevelMenu.add(warning);
 error = new JCheckBoxMenuItem(LogLevel.ERROR);
 error.addActionListener(this);
 error.setState(true);
 logLevelMenu.add(error);
 return (menubar);
   }
   private JPanel createMainPanel()  {
 JPanel p = new JPanel();
 p.setLayout(new BorderLayout());
 logMsgArea = new JTextArea(12, 80);
 logMsgArea.setEditable(false);
 JScrollPane tablePane = new JScrollPane(logMsgArea);
 p.add(BorderLayout.CENTER, tablePane);
 return (p);
   }
   private JComponent createToolBar()  {
 JPanel p = new JPanel();
 JLabel l;
 p.setLayout(new FlowLayout(FlowLayout.LEFT));
 l = new JLabel("Log messages for broker at address: ");
 p.add(l);
 brokerAddress = new JLabel("<none>");
 p.add(brokerAddress);
 return (p);
   }
   private JPanel createStatusArea()  {
 JPanel p = new JPanel();
 p.setLayout(new BorderLayout());
 statusTextArea = new JTextArea(3, 80);
 statusTextArea.setLineWrap(true);
 statusTextArea.setEditable(false);
 JScrollPane statusTextPane = new JScrollPane(statusTextArea);
 p.add(statusTextPane,  BorderLayout.CENTER);
 return (p);
   }
   public void actionPerformed(ActionEvent e)  {
 Object src = e.getSource();
 if (src instanceof JCheckBoxMenuItem)  {
     JCheckBoxMenuItem cb = (JCheckBoxMenuItem)src;
     if (src == info)  {
         logOn();
     } else if (src == warning)  {
         logOn();
     } else if (src == error)  {
         logOn();
     }
 } else if (src instanceof JMenuItem)  {
     JMenuItem mi = (JMenuItem)src;
     if (src == exit)  {
         System.exit(0);
     } else if (src == connect)  {
   showConnectDialog();
     } else if (src == disconnect)  {
   doDisconnect();
     } else if (src == clearLog)  {
   clearLogArea();
     }
 } else if (src instanceof JButton) {
     address = connectDialog.getAddress();
     adminUser = connectDialog.getUserName();
     adminPasswd = connectDialog.getPassword();
     doConnect();
 }
   }
   private void showConnectDialog()  {
 if (connectDialog == null)  {
     connectDialog = new MQConnectDialog(f, "Connect to Broker", this);
     connectDialog.setAddress((address == null) ?
                     getDefaultAddress() : address);
     connectDialog.setUserName((adminUser == null) ?
                     getDefaultUserName() : adminUser);
     connectDialog.setPassword((adminPasswd == null) ?
                     getDefaultPassword() : adminPasswd);
 }
 connectDialog.setLocationRelativeTo(f);
 connectDialog.setVisible(true);
   }
   private static void doExit()  {
 System.exit(0);
   }
   private String getDefaultUserName()  {
 AdminConnectionFactory acf = new AdminConnectionFactory();
 String addr;
 try  {
     addr = acf.getProperty(AdminConnectionConfiguration.imqDefaultAdminUsername);
 } catch(Exception e)  {
     addr = null;
 }
 return (addr);
   }
   private String getDefaultPassword()  {
 AdminConnectionFactory acf = new AdminConnectionFactory();
 String addr;
 try  {
     addr = acf.getProperty(AdminConnectionConfiguration.imqDefaultAdminPassword);
 } catch(Exception e)  {
     addr = null;
 }
 return (addr);
   }
   private String getDefaultAddress()  {
 /*
 AdminConnectionFactory acf = new AdminConnectionFactory();
 String addr;
 try  {
     addr = acf.getProperty(AdminConnectionConfiguration.imqAddress);
 } catch(Exception e)  {
     addr = null;
 }
 return (addr);
 */
 return ("localhost:7676");
   }
   public static void main(String[] args)  {
 JFrame frame;
 MQLogViewer s;
 String address = null, adminUser = null, adminPasswd = null,
   secondStr = null;
 long seconds = 5;
 for (int i = 0; i < args.length; ++i)  {
     if (args[i].equals("-b"))  {
   if (++i >= args.length)  {
       usage();
   }
   address = args[i];
     } else if (args[i].equals("-u"))  {
   if (++i >= args.length)  {
       usage();
   }
   adminUser = args[i];
     } else if (args[i].equals("-p"))  {
   if (++i >= args.length)  {
       usage();
   }
   adminPasswd = args[i];
     } else  {
   usage();
     }
 }
 frame = new JFrame("MQ Log Viewer");
 s = new MQLogViewer(frame, address, adminUser, adminPasswd);
 frame.addWindowListener(new WindowAdapter() {
     public void windowClosing(WindowEvent e) {
   doExit();
     }
 });
 
 frame.pack(); 
 frame.setVisible(true);
   }
   public static void usage()  {
 usage(null);
   }
   public static void usage(String msg)  {
 if (msg != null)  {
           System.err.println(msg);
 }
       System.err.println("java MQLogViewer"
 + "[-b <host:port>] [-u <admin user name>] [-p <admin password>]");
 doExit();
   }

}

/*

* @(#)MQConnectDialog.java  1.1 05/06/06
*
* Copyright (c) 2000-2005 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MQConnectDialog extends JDialog

   implements ActionListener {
   JButton apply, cancel;
   JTextField address, username;
   JPasswordField password;
   private boolean applyHit = false;
   private ActionListener applyListener = null;
   public MQConnectDialog(Frame parent, String title, 
     ActionListener applyListener)  {
 super(parent, title, true);
 this.applyListener = applyListener;
 initContentPane();
 pack();
   }
   public boolean applyDone()  {
 return (applyHit);
   }
   private void initContentPane()  {
 JPanel panel = new JPanel();
 panel.setLayout(new BorderLayout());
 /*
  * Create "work" panel
  */
 JPanel workPanel = createWorkPanel();
 /*
  * Create button panel
  */
 JPanel buttonPanel = createButtonPanel();
 panel.add(workPanel, "Center");
 panel.add(buttonPanel, "South");
 getContentPane().add(panel);
   }
   private JPanel createWorkPanel()  {
 JPanel workPanel = new JPanel();
 GridBagLayout gridbag = new GridBagLayout();
 GridBagConstraints c = new GridBagConstraints();
 JLabel l;
 workPanel.setLayout(gridbag);
 c.anchor = GridBagConstraints.WEST;
 c.fill = GridBagConstraints.NONE;
 c.insets = new Insets(2, 2, 2, 2);
 c.ipadx = 0;
 c.ipady = 0;
 c.weightx = 1.0;
 c.gridx = 0;
 c.gridy = 0;
 l = new JLabel("Address:");
 gridbag.setConstraints(l,c);
 workPanel.add(l);
 c.gridx = 1;
 c.gridy = 0;
 address = new JTextField(20);
 gridbag.setConstraints(address,c);
 workPanel.add(address);
 c.gridx = 0;
 c.gridy = 1;
 l = new JLabel("Name:");
 gridbag.setConstraints(l,c);
 workPanel.add(l);
 c.gridx = 1;
 c.gridy = 1;
 username = new JTextField(20);
 gridbag.setConstraints(username, c);
 workPanel.add(username);
 c.gridx = 0;
 c.gridy = 2;
 l = new JLabel("Password:");
 gridbag.setConstraints(l,c);
 workPanel.add(l);
 c.gridx = 1;
 c.gridy = 2;
 password = new JPasswordField(20);
 gridbag.setConstraints(password, c);
 workPanel.add(password);
 return (workPanel);
   }
   public void setAddress(String s)  {
 address.setText(s);
   }
   public String getAddress()  {
 return (address.getText());
   }
   public void setUserName(String s)  {
 username.setText(s);
   }
   public String getUserName()  {
 return (username.getText());
   }
   public void setPassword(String s)  {
 password.setText(s);
   }
   public String getPassword()  {
 return (new String(password.getPassword()));
   }
   private JPanel createButtonPanel()  {
 JPanel buttonPanel = new JPanel();
 buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
 apply = new JButton("Apply");
 apply.addActionListener(this);
 if (applyListener != null)  {
     apply.addActionListener(applyListener);
 }
 buttonPanel.add(apply);
 cancel = new JButton("Cancel");
 cancel.addActionListener(this);
 buttonPanel.add(cancel);
 return (buttonPanel);
   }
   public void actionPerformed(ActionEvent e)  {
 Object src = e.getSource();
 if (src == apply)  {
     applyHit = true;
     setVisible(false);
 } else if (src == cancel)  {
     applyHit = false;
     setVisible(false);
 }
   }

}

       </source>