6

次の属性と操作を持つ MBean があるとします。

属性: 名前サイズ

オペレーション: getName() getSize()

属性と操作をプログラムでチェックする方法はありますか? 私は IBM WebSphere MBeans を扱ってきましたが、それらのドキュメントはあまり良くありません。

例えば、IBMs Infocenterにアクセスして、Network Deployment -> Reference -> Programming interfaces -> Mbean interfaces -> ThreadPool にナビゲートするとします。それらにはリストされた属性のみがあり、操作はありません。

WebSphere wsadmin ツールを使用して、実際に操作と属性を確認できます。すべての MBean でこれを行う方法があるかどうか知りたいです。

wsadmin>print Help.attributes(object)
Attribute                       Type                            Access
name                            java.lang.String                RO
maximumSize                     int                             RW
minimumSize                     int                             RW
inactivityTimeout               long                            RW
growable                        boolean                         RW
stats                           javax.management.j2ee.statistics.Stats  RO

wsadmin>print Help.operations(object)
Operation
java.lang.String getName()
int getMaximumPoolSize()
void setMaximumPoolSize(int)
int getMinimumPoolSize()
void setMinimumPoolSize(int)
long getKeepAliveTime()
void setKeepAliveTime(long)
boolean isGrowAsNeeded()
void setGrowAsNeeded(boolean)
javax.management.j2ee.statistics.Stats getStats()
4

2 に答える 2

12

JMX MBean の操作と属性をプログラムでチェックする方法は?

現在の JVM 内から MBean をプログラムで検索することについて話しているのか、クライアントからリモートで検索することについて話しているのか、私にはよくわかりません。多くの JMX クライアント ライブラリがあります。私のSimpleJMX パッケージを試してみてください。

私のコードでは、次のようなことができます:

JmxClient client = new JmxClient(hostName, port);
Set<ObjectName> objectNames = getBeanNames() 
for (ObjectName name : objectNames) {
    MBeanAttributeInfo[] attributes = getAttributesInfo(name);
    MBeanOperationInfo[] operations = getOperationsInfo(name);
}

現在の JVM について質問している場合は、次の方法で内部 Bean から Bean 情報を取得できるはずです。

MBeanServer server = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> objectNames = server.queryNames(null, null);
for (ObjectName name : objectNames) {
    MBeanInfo info = server.getMBeanInfo(name);
}
于 2012-04-27T14:26:12.077 に答える
3

ActiveMQ の単純な JMX の例を次に示します。activeMQ 値を置き換えるだけで、将来誰かに役立つ可能性があります。

String brokerName = "AMQBroker";
String username = "";
String password = "";
String hostname = "localhost";
int port = 1099;

Map<String, Object> env = new HashMap<String, Object>();
if (username != null || password != null) {
    String[] credentials = new String[] { username, password };
    env.put("jmx.remote.credentials", credentials);
}

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + hostname + ":" + port + "/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
MBeanServerConnection conn = jmxc.getMBeanServerConnection();

// here is example for Type=Broker, can be different like
// "org.apache.activemq:BrokerName=" + brokerName + ",Type=Connection,ConnectorName=openwire,Connection=*"
// "org.apache.activemq:BrokerName=" + brokerName + ",*,Type=NetworkBridge" or same for Queue, Topic, Subscription
ObjectName name = new ObjectName("org.apache.activemq:BrokerName=" + brokerName + ",Type=Broker");
Set<ObjectName> queryNames = conn.queryNames(name, null);
// here is set with one element, but can be more depending on ObjectName query
for (ObjectName objectName : queryNames) {
    System.out.println(objectName.getCanonicalName());
    // use attribute you can be interested in
    System.out.println(conn.getAttribute(objectName, "Slave"));
}
于 2013-03-26T09:54:25.693 に答える