我试图在不使用任何API(例如Hermes或GEMS)的情况下监视队列,即我想使用纯粹的JAVA。因此,为了浏览队列,即检查消息是否已到达队列而不实际消费我在下面写的代码消息:
javax.jms.QueueBrowser browser = session.createBrowser(queue);
Enumeration msgs = browser.getEnumeration();
int Count=0;
while(msgs.hasMoreElements())
{
message = (javax.jms.Message)msgs.nextElement();
System.out.println("Message"+message);
Count++;
}
但是,当我在队列中发布消息时,它不会显示结果。我已经验证了消息到达队列并且接收器正在消耗相同的消息。 因为这种方法不起作用,我想使用一种不同的方法,即通过计算队列之前和之后接收的numberOfMessages。所以我使用下面的代码
QueueInfo q= new QueueInfo(queueName);
long l=q.getInTransitMessageCount();
System.out.println("In transit Mesasge Count="+l+"\n");
但这也行不通。 任何有关解决此问题的建议或解释都将受到高度赞赏。 请注意,代码中没有编译错误,导入了所有必需的类。
答案 0 :(得分:1)
您使用的代码将在一个时刻计算队列中的消息数。在大多数JMS实现中,在此时间片之外发布然后消息的消息将不会显示,并且消息会非常快速地消耗。
当我们监控活动消息队列时,我们只担心队列中是否有消息,因为这意味着消费者已经停止或消耗得不够快。
如果您正在尝试计算过去的消息,那么您将需要拦截消息(即自己消费并将它们发布到另一个队列)。
您可能想要提供有关您真正想要的内容的更多信息。
答案 1 :(得分:0)
您的浏览器代码似乎是正确的..检查您是否正在传递正确的队列参数。或者只是调试并查看为什么不执行该循环?
答案 2 :(得分:0)
QueueBrowser不需要为您提供快照。如果队列中有其他消费者,那么他们将会消耗它,因此它们可能会被取消。请先尝试关闭您的消费者,看看会发生什么。见[1]
[1] http://docs.oracle.com/javaee/1.3/api/javax/jms/QueueBrowser.html