在 Wildfly 上获取 JMS 队列对象名
Get JMS Queue ObjectName on Wildfly
我想获取队列中的对象数。这是我找到的代码:
MBeanServerConnection mbeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName queueName = ObjectNameBuilder.DEFAULT.getJMSQueueObjectName(queue.getQueueName());
Integer messageCount = (Integer) mbeanServer.getAttribute(queueName, "MessageCount");
这段代码有问题。首先wildfly上没有ObjectNameBuilder
class(需要什么模块吗!?)。
使用HornetQ ObjectNameBuilderclass源码后,自己实现了功能,现在报错:
org.hornetq:module=JMS,type=Queue,name="MyQueueName"
我正在使用 Wildfly v9.0.1-Final
。有什么建议吗?
我遇到了类似的问题,一些细节让一切变得不同。
如果你是运行域模式的Wildfly那么你必须按如下方式连接:
HashMap environment = new HashMap();
environment.put(JMXConnector.CREDENTIALS, new String[] { "your_user", "your_password" });
JMXServiceURL url = new JMXServiceURL("service:jmx:http-remoting-jmx://your_host:8080");
JMXConnector jmxConnector = JMXConnectorFactory.connect(url, environment);
MBeanServerConnection connection = jmxConnector.getMBeanServerConnection();
注意:请注意,远程连接的端口应该是8080,而不是9990。另一个重要的细节:your_user必须是应用程序类型的用户,不能是mgmt类型的用户。
此外,您还应该将 JMX domain.xml 上的设置保留如下:
<subsystem xmlns="urn:jboss:domain:jmx:1.3">
<expose-resolved-model/>
<expose-expression-model/>
<remoting-connector use-management-endpoint="false" />
</subsystem>
如果你是运行独立模式下的Wildfly必须使用9990端口,不需要认证。
再详细一点,尝试恢复信息如下:
String queueName = "YourQueue"; // use your queue name jms-queue
String mbeanObjectName = "jboss.as:subsystem=messaging,hornetq-server=default,jms-queue=" + queueName;
ObjectName objectName = ObjectName.getInstance(mbeanObjectName);
JMSQueueControl jmsQueueControl = (JMSQueueControl) MBeanServerInvocationHandler.newProxyInstance(connection, objectName, JMSQueueControl.class, false);
assert jmsQueueControl != null;
long msgCount = jmsQueueControl.countMessages(null);
System.out.println(mbeanObjectName + " message count: " + msgCount);
请注意,我没有使用密钥 "org.hornetq:module=JMS,type=Queue,name=",而是使用了 "jboss.as:subsystem=messaging,hornetq-server=default,jms-queue="。
理想情况下,使用 jconsole 验证密钥的确切名称。
我想获取队列中的对象数。这是我找到的代码:
MBeanServerConnection mbeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName queueName = ObjectNameBuilder.DEFAULT.getJMSQueueObjectName(queue.getQueueName());
Integer messageCount = (Integer) mbeanServer.getAttribute(queueName, "MessageCount");
这段代码有问题。首先wildfly上没有ObjectNameBuilder
class(需要什么模块吗!?)。
使用HornetQ ObjectNameBuilderclass源码后,自己实现了功能,现在报错:
org.hornetq:module=JMS,type=Queue,name="MyQueueName"
我正在使用 Wildfly v9.0.1-Final
。有什么建议吗?
我遇到了类似的问题,一些细节让一切变得不同。
如果你是运行域模式的Wildfly那么你必须按如下方式连接:
HashMap environment = new HashMap();
environment.put(JMXConnector.CREDENTIALS, new String[] { "your_user", "your_password" });
JMXServiceURL url = new JMXServiceURL("service:jmx:http-remoting-jmx://your_host:8080");
JMXConnector jmxConnector = JMXConnectorFactory.connect(url, environment);
MBeanServerConnection connection = jmxConnector.getMBeanServerConnection();
注意:请注意,远程连接的端口应该是8080,而不是9990。另一个重要的细节:your_user必须是应用程序类型的用户,不能是mgmt类型的用户。
此外,您还应该将 JMX domain.xml 上的设置保留如下:
<subsystem xmlns="urn:jboss:domain:jmx:1.3">
<expose-resolved-model/>
<expose-expression-model/>
<remoting-connector use-management-endpoint="false" />
</subsystem>
如果你是运行独立模式下的Wildfly必须使用9990端口,不需要认证。
再详细一点,尝试恢复信息如下:
String queueName = "YourQueue"; // use your queue name jms-queue
String mbeanObjectName = "jboss.as:subsystem=messaging,hornetq-server=default,jms-queue=" + queueName;
ObjectName objectName = ObjectName.getInstance(mbeanObjectName);
JMSQueueControl jmsQueueControl = (JMSQueueControl) MBeanServerInvocationHandler.newProxyInstance(connection, objectName, JMSQueueControl.class, false);
assert jmsQueueControl != null;
long msgCount = jmsQueueControl.countMessages(null);
System.out.println(mbeanObjectName + " message count: " + msgCount);
请注意,我没有使用密钥 "org.hornetq:module=JMS,type=Queue,name=",而是使用了 "jboss.as:subsystem=messaging,hornetq-server=default,jms-queue="。
理想情况下,使用 jconsole 验证密钥的确切名称。