如何在IBM WAS上的jms主题中获取当前消息数

时间:2019-08-20 08:40:51

标签: java jms websphere jms-topic

我需要使用Java编程语言创建一个REST服务,该服务接收JMS连接工厂的JNDI名称和JMS主题的JNDI名称作为输入,并且现在应该返回资源中的消息数。 问题是从IBM WAS获得话题的长度。

我知道Oracle中存在TopicBrowser,您可以使用TopicBrowser获取主题中的所有消息并只计算其数量。但是由于某些原因,我们不使用它。

我的想法是获取SIB目标队列长度属性,该属性位于: 总线>总线>收件人> MyTopic.Space>发布点,在Web控制台中。

我使用:
IBM WAS 9.0。 ND。
默认消息提供者。

任何建议我都会很高兴。

1 个答案:

答案 0 :(得分:1)

您可以使用管理客户端获取订户的状态,例如:

                          // Start by querying the objectName of the Publication Point (Topic Space on a specific node).
         AdminClient adminClient = AdminClientFactory.createAdminClient(connectProps);
         StringBuffer oNameQuery= new StringBuffer();        
         oNameQuery.append(adminClient.getDomainName()).append(":*");
         oNameQuery.append(",type=").append("SIBPublicationPoint");
         oNameQuery.append(",name=").append("Default.Topic.Space");
         oNameQuery.append(",node=").append(nodeName); 
         oNameQuery.append(",process=").append("server1"); 
         oSet= adminClient.queryNames(new ObjectName(oNameQuery.toString()), null); 
         ObjectName defaultTopicSpaceOn = (ObjectName) oSet.iterator().next();
         System.out.println("Default.Topic.Space ObjectName:"+defaultTopicSpaceOn);

        // Then look at each subscription storing messages in the Publication Point.
        Long depth = (Long) adminClient.invoke (defaultTopicSpaceOn, "getDepth", null, null);
        System.out.println("DefaultTopicSpace Depth:"+depth+"\n");
        SIBSubscription[] subscriptions = (SIBSubscription[]) adminClient.invoke (defaultTopicSpaceOn, "getSubscriptions", null, null);
        for (SIBSubscription subscription : subscriptions) {
          System.out.print("DefaultTopicSpace Subscription:"+subscription.getName() 
                             +" Id:"+subscription.getId()
                             +" SubscriberId:"+subscription.getSubscriberId()
                             +" Selector:"+subscription.getSelector()
                             +" Depth:"+subscription.getDepth());
          for (String topicName: subscription.getTopics())
            System.out.print(" Topic:"+topicName);
          System.out.println();
        }

这会产生类似的内容:

DefaultTopicSpace深度:2

DefaultTopicSpace订阅:Default.Topic.Space ID:21974964F5B726A6C21C7E59 SubscriberId:jmsThinClient.JMSSendReceiveclientID ## jmsThinClient.JMSSendReceiveSubscription选择器:空深度:2主题:Topic1 / *

Api文档:https://www.ibm.com/support/knowledgecenter/SSEQTP_8.5.5/com.ibm.websphere.javadoc.doc/web/apidocs/com/ibm/websphere/sib/admin/package-summary.html