![](/img/trans.png)
[英]Is there a way for C# to communicate with a Java server via JMX using MBeans?
[英]Accessing Weblogic JMS using Java and JMX/MBeans
我正在嘗試編寫一個Java程序,它可以瀏覽Weblogic JMS服務器中的所有JMS隊列,並讀取給定隊列中的消息(但不消耗它們)。 我正在嘗試使用Weblogic Mbeans和JMX,但對兩者都是新手。 我有以下代碼來獲取所有隊列及其深度:
private void countMessages1() throws Exception {
JMXConnector connector = getMBeanServerConnector("/jndi/"+RuntimeServiceMBean.MBEANSERVER_JNDI_NAME);
MBeanServerConnection mbeanServerConnection = connector.getMBeanServerConnection();
ObjectName service = new ObjectName("com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean");
ObjectName serverRuntime = (ObjectName) mbeanServerConnection.getAttribute(service, "ServerRuntime");
ObjectName jmsRuntime = (ObjectName) mbeanServerConnection.getAttribute(serverRuntime, "JMSRuntime");
ObjectName[] jmsServers = (ObjectName[]) mbeanServerConnection.getAttribute(jmsRuntime, "JMSServers");
for (ObjectName jmsServer: jmsServers) {
if ("JMSServer".equals(jmsServer.getKeyProperty("Name"))) {
ObjectName[] destinations = (ObjectName[]) mbeanServerConnection.getAttribute(jmsServer, "Destinations");
for (ObjectName destination: destinations) {
String queueName = destination.getKeyProperty("Name");
Long queueDepth = (Long) mbeanServerConnection.getAttribute(destination, "MessagesCurrentCount");
System.out.println("Queue: " + queueName + " Depth: " + queueDepth);
}
break;
}
}
connector.close();
}
我還能夠從隊列中刪除所有內容:
mbeanServerConnection.invoke(destination, "deleteMessages", new Object[] {""}, new String[] {"java.lang.String"});
我遇到的問題是如何讀取目標/隊列中的實際消息。 我一直在玩mbeanServerConnection.invoke,我看到了getMessage和getMessages,但我不確定如何正確使用它們。 有人可以展示一個如何使用它們來瀏覽目的地中的消息(但不消耗它們)的例子嗎? 我嘗試了一些像這樣的變種,但我無法讓它工作:
String message = (String) mbeanServerConnection.invoke(destination, "getMessage", new Object[] { "", 0, JMS_ALL_STATES}, new String[] {"java.lang.String"});
經過一番研究,我能夠編寫出符合我想要的代碼:
for (ObjectName destination: destinations) {
if (destination.getKeyProperty("Name").equalsIgnoreCase(selectedQueue)) {
try {
String cursor = (String)mbeanServerConnection.invoke(destination, "getMessages", new Object[] {"", 0}, new String[] {"java.lang.String", "java.lang.Integer"});
Long cursorSize = (Long)mbeanServerConnection.invoke(destination, "getCursorSize", new Object[] {cursor}, new String[] {"java.lang.String"});
//System.out.println(cursor + ": " + cursorSize);
CompositeData[] messages = (CompositeData[])mbeanServerConnection.invoke(destination, "getNext", new Object[] {cursor, cursorSize.intValue()}, new String[] {"java.lang.String", "java.lang.Integer"});
if (null != messages) {
for (CompositeData message: messages) {
JMSMessageInfo messageInfo = new JMSMessageInfo(message);
Long messageInfoHandle = messageInfo.getHandle();
CompositeData messageCursor = (CompositeData)mbeanServerConnection.invoke(destination, "getMessage", new Object[] {cursor, messageInfoHandle}, new String[] {"java.lang.String", "java.lang.Long"});
JMSMessageInfo mbi = new JMSMessageInfo(messageCursor);
WLMessage messageBody = mbi.getMessage();
body = messageBody.toString().substring(messageBody.toString().indexOf(", ") + 2, messageBody.toString().length()-1);
Object[] row = {counter, body};
publish(row);
if (isCancelled()) {
modelMessages.setRowCount(0);
return model;
}
}
}
} catch (Exception e) {
e.printStackTrace();
modelMessages.setRowCount(0);
return model;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.