Java/J2EE/JMX
Содержание
- 1 Create the Hello MBean and QueueSampler MXBean, register them in the platform MBean server
- 2 how failure to supply an appropriate authentication mechanism results in a failure to create an initial context
- 3 JMX client
- 4 JMX client that interacts with the JMX agent
- 5 JMX (Java Management Extensions): scan directory
- 6 List JMX destination
- 7 MQ log
Create the Hello MBean and QueueSampler MXBean, register them in the platform MBean server
/*
* 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;
}
how failure to supply an appropriate authentication mechanism results in a failure to create an initial context
/*
* 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();
}
}
}
JMX client
/*
* @(#)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();
}
}
}
JMX client that interacts with the JMX agent
/*
* 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;
}
}
JMX (Java Management Extensions): scan directory
List JMX destination
/*
* @(#)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();
}
}
}
MQ log
/*
* @(#)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);
}
}
}