首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Java和JMX/MBean访问Weblogic

使用Java和JMX/MBean访问Weblogic
EN

Stack Overflow用户
提问于 2014-03-04 13:39:05
回答 1查看 3.9K关注 0票数 4

我试图编写一个Java程序,它可以浏览Weblogic服务器中的所有JMS队列,并读取给定队列中的消息(但不使用它们)。我正在尝试使用Weblogic和JMX,但这两者都是新手。我有以下代码来获取所有队列及其深度:

代码语言:javascript
运行
复制
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();
}

我还可以删除队列中的所有内容:

代码语言:javascript
运行
复制
mbeanServerConnection.invoke(destination, "deleteMessages", new Object[] {""}, new String[] {"java.lang.String"});

我陷入困境的地方是如何读取目的地/队列中的实际消息。我一直在玩mbeanServerConnection.invoke,我看到了getMessage和getMessages,但是我不知道如何正确地使用它们。有人能给我们举个例子,说明如何在目的地浏览消息(但不使用它们)?我尝试过一些类似的变体,但我无法让它发挥作用:

代码语言:javascript
运行
复制
String message = (String) mbeanServerConnection.invoke(destination, "getMessage", new Object[] { "", 0, JMS_ALL_STATES}, new String[] {"java.lang.String"});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-05 15:11:55

经过一些研究之后,我能够编写这段代码来实现我想做的事情:

代码语言:javascript
运行
复制
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;
        }
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22173512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档