我需要使用Java编程语言创建一个REST服务,该服务接收JMS连接工厂的JNDI名称和JMS主题的JNDI名称作为输入,并且现在应该返回资源中的消息数。 问题是从IBM WAS获得话题的长度。
我知道Oracle中存在TopicBrowser,您可以使用TopicBrowser获取主题中的所有消息并只计算其数量。但是由于某些原因,我们不使用它。
我的想法是获取SIB目标队列长度属性,该属性位于: 总线>总线>收件人> MyTopic.Space>发布点,在Web控制台中。
我使用:
IBM WAS 9.0。 ND。
默认消息提供者。
任何建议我都会很高兴。
答案 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 / *