【问题标题】:Check if there are JMS messages on Glassfish 3 cluster nodes检查 Glassfish 3 集群节点上是否有 JMS 消息
【发布时间】:2013-05-30 20:36:07
【问题描述】:

我正在尝试检查队列中是否有消息。要访问队列,我使用连接工厂、目标资源和 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;
}

【问题讨论】:

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


    【解决方案1】:

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

    在代理集群中,您在一个代理上创建一个物理目标,然后集群将其传播给所有其他代理。因为代理合作在集群中路由消息,所以客户端应用程序可以使用来自集群中任何代理上的目的地的消息。

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

    【讨论】:

    • 不幸的是,来自集群的队列有不同的消息。在一种情况下,一个队列是空的,而其他队列有消息。
    • 这意味着集群并没有真正起作用,这是一个完全不同的问题。我在这里的回答中要说的是,解决方案不是浏览集群中队列的所有副本。我建议使用您的集群配置创建一个新问题,说明您的集群为什么不起作用。
    猜你喜欢
    • 1970-01-01
    • 2013-02-23
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 2013-10-07
    • 2017-03-31
    相关资源
    最近更新 更多