2013-06-04 129 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