2013-06-04 1 views
0

Я пытаюсь проверить, есть ли сообщения в очереди. Для доступа к очереди я использую Factory Connection, Resource Destination и JNDI lookup (метод ниже). Проблема возникает, когда Factory Connection указывает на несколько узлов из кластера Glassfish 3. У свойства AddressList есть список с IP-адресами узлов.Проверьте, есть ли сообщения JMS на узлах кластера Glassfish 3

Один из способов его решения - проверить каждый узел. Есть ли способ прочитать значение свойства AddressList из фабрики соединений JMS, определенной в ресурсах Glassfish?

Есть ли другие способы проверить, есть ли сообщения в очереди на всех узлах кластера 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