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

How to get the current number of messages in a jms topic on IBM WAS

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

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

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

我使用:
IBM 是 9.0。 ND.
默认消息提供程序。

我很乐意接受任何建议。

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

                          // 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();
        }

这会产生如下内容:

默认主题空间Depth:2

DefaultTopicSpace Subscription:Default.Topic.Space Id:21974964F5B726A6C21C7E59 SubscriberId:jmsThinClient.JMSSendReceiveclientID##jmsThinClient.JMSSendReceiveSubscription Selector:null Depth:2 Topic: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