2015-09-05 122 views
1

我想获取队列中的对象数量。这是我找到的代码:在蜻蜓上获取JMS队列ObjectName

MBeanServerConnection mbeanServer = ManagementFactory.getPlatformMBeanServer(); 
ObjectName queueName = ObjectNameBuilder.DEFAULT.getJMSQueueObjectName(queue.getQueueName()); 
Integer messageCount = (Integer) mbeanServer.getAttribute(queueName, "MessageCount"); 

这段代码存在一些问题。首先,野蝇类没有ObjectNameBuilder类(有没有需要的模块!?)。

使用HornetQ的ObjectNameBuilder类的源代码后,我已经通过自己实现的功能,但现在收到此错误:

org.hornetq:module=JMS,type=Queue,name="MyQueueName" 

我使用Wildfly v9.0.1-Final。任何建议?

回答

2

我正面临类似的问题,一些细节使所有的差异。

如果您在域模式下运行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必须应用程序类型的用户并且不是管理型用户。

你也应该离开设置你的JMX的domain.xml如下:

<subsystem xmlns="urn:jboss:domain:jmx:1.3"> 
    <expose-resolved-model/> 
    <expose-expression-model/> 
    <remoting-connector use-management-endpoint="false" /> 
</subsystem> 

如果您在独立模式下必须使用9990端口和身份验证运行Wildfly不是必需的。

一个更详细地,尝试恢复该信息如下:

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:队列模块= JMS,类型=,名字=”我使用的“的JBoss 。如:子系统=消息,将hornetq-服务器=默认,JMS队列=”。

理想情况下,使用jconsole验证您的密钥的确切名称。