检查Glassfish 3群集节点上是否有JMS消息

时间:2013-06-04 12:34:18

标签: jms java-ee-6 glassfish-3

我正在尝试检查队列中是否有消息。要访问队列,我正在使用连接工厂,目标资源和JNDI查找(下面的方法)。连接工厂指向Glassfish 3群集中的多个节点时出现问题。 AddressList 属性具有包含节点的IP地址的列表。

解决这个问题的一种方法是检查每个节点。有没有办法从Glassfish资源中定义的JMS连接工厂读取 AddressList 属性的值?

还有其他方法可以检查Glassfish 3群集的所有节点上的队列中是否有消息?

不希望在配置文件和JMS连接工厂中保存群集节点的地址(连接工厂已在应用程序的某些其他部分中使用)。

感谢。

private boolean existsMessagesOnTheQueue(String connectionFactoryName, Queue queue, String selector) throws Exception {
    QueueConnectionFactory connectionFactory;
    QueueConnection connection;
    Session session ;
    QueueBrowser browser ;
    try {
        connectionFactory = (QueueConnectionFactory) InitialContext.doLookup(connectionFactoryName);
        connection = connectionFactory.createQueueConnection();
        session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
        browser = session.createBrowser(queue, selector);

        connection.start();

        if (browser.getEnumeration().hasMoreElements()) {
            log.debug("Found message on " + queue.getQueueName());
            return true;
        }
    } finally {
        closeBrowser(browser);
        closeSession(session);
        closeConnection(connection);
    }
    return false;
}

1 个答案:

答案 0 :(得分:0)

即使连接工厂在其AddressList属性中列出了多个节点,也可以检查其中任何一个地址中的消息。群集中的所有其他副本将具有相同的消息。 来自Oracle doc

  

在代理群集中,您在一个代理上创建物理目标,并且群集将其传播到所有其他代理。由于代理协作以跨群集路由消息,因此客户端应用程序可以使用群集中任何代理上的目标消息。

以上提到了来自群集中任何代理的客户端consuming消息。因此,Browsing也可以通过任何经纪人完成。