使用Java监控队列

使用Java监控队列,java,jms,tibco-ems,Java,Jms,Tibco Ems,我试图在不使用任何API(如Hermes或GEMS)的情况下监视队列,即我想使用纯JAVA。因此,为了浏览队列,即检查消息是否已到达队列,而不实际使用我在下面编写的一段代码: javax.jms.QueueBrowser browser = session.createBrowser(queue); Enumeration msgs = browser.getEnumeration(); int Count=0; while(msgs.has

我试图在不使用任何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++;
        }
但是,当我在队列上发布消息时,它不会显示结果。我已验证消息正在到达队列,并且接收方正在使用这些消息。 因此,由于这种方法不起作用,我想使用另一种方法,即通过计算队列前后接收的消息数。所以我使用了下面的代码

QueueInfo q= new QueueInfo(queueName);
    long l=q.getInTransitMessageCount();
    System.out.println("In transit Mesasge Count="+l+"\n");
但这也不起作用。 如有任何解决此问题的建议或解释,将不胜感激。
请注意,代码中没有编译错误,所有必需的类都已导入。

您的浏览器代码似乎正确。请检查您是否传递了正确的队列参数。或者只是调试,看看为什么不执行该循环?

QueueBrowser不需要给您快照。如果您有其他消费者在排队,那么他们会将其排干,因此他们有可能被拉下。请先关闭您的消费者,看看会发生什么。见[1]


[1]

您正在使用的代码将计算单个时刻队列中的消息数。在该时间片之外发布并随后使用的消息将不会显示,并且在大多数JMS实现中,消息的使用速度非常快

当我们监视活动消息队列时,我们只关心队列中是否有消息,因为这意味着消费者已经停止或消费速度不够快

如果您试图计算通过的消息数,则需要截获消息(即自己使用消息并将其发送到另一个队列)


您可能想提供更多有关您真正想要的信息。

使用的jms提供程序是哪一个?@Scorpion我使用的是Tibco企业消息服务器我无法关闭接收器,因为超出我范围的第三方系统正在监听该服务。如果我这样做了,那么监控的意义何在?这就是我试图实现的目标。我们有一个流程,在执行一些操作后将消息发布到JMS队列上。另一个系统实际上正在使用这些消息。因此,我们需要确保我们的流程运作良好。我知道我们有GEMS或Hermes之类的监控工具,但我们需要自动化这个过程,所以我计划从队列中获取计数并将其写入文件。任何其他选项,请建议。我可能会让您的进程维护一些内部计数器,并将它们作为MBean公开。监视器可以查询MBean并每隔1分钟左右重置一次值。这将为您提供每分钟事务数。此外,任何商业监控工具都将连接到MBean。@Vivek您可以扩展您的用例吗?哪一方需要验证交付?生产系统?消费体系?还是一个完全不同的监控系统?