2013-06-04 92 views
0

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

解决它的一种方法是检查每个节点。有没有办法从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; 
} 

回答

0

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

在代理群集中,你在一个经纪人创建一个物理目的地和群集它传播到所有其他人。由于代理合作在群集中路由消息,因此客户端应用程序可以使用群集中任何代理中目标的消息。

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

+0

不幸的是,群集中的队列有不同的消息。在一种情况下,队列是空的,而其他队列中有消息。 –

+0

这意味着集群不是真的有效,这是一个完全不同的问题。我在我的答案中说的是,解决方案并不是浏览群集中的所有队列副本。我建议在群集配置中为您的群集不起作用创建一个新问题。 – brainOverflow