2015-09-05 103 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驗證您的密鑰的確切名稱。