JMS-клиент не получает сообщения - PullRequest
1 голос
/ 03 октября 2009

Я использую Glassfish JMS.

Я могу добавлять сообщения в очередь. Я могу видеть сообщения, используя объект QueueBrowser. Однако MessageConsumer (или QueueReceiver) не может получить любое сообщение и вернуть ноль. Срок действия сообщения установлен на 0, и я не забываю открыть соединение.

Есть идеи?

Вот код:

      Session session = null;
      Connection conn = null;

      try
      {
         InitialContext jndi = new InitialContext();

            ConnectionFactory qFactory = (ConnectionFactory)jndi.
                lookup("myConnectionFactory");
              conn = qFactory.createConnection();
              conn.start();
         Queue queue = (Queue)jndi.lookup("myQueueName");
         session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);


          QueueReceiver  mc = ((QueueSession)session).createReceiver(queue);

         Object  m = mc.receive(2000);
         //m is NULL!

         QueueBrowser browser = session.createBrowser(queue);


         for(Enumeration e = browser.getEnumeration(); e.hasMoreElements(); )
         {
             //there are many messages here...
         }

Ответы [ 3 ]

1 голос
/ 03 октября 2009

Было бы хорошо иметь код клиента.

Подобные вещи произошли со мной, когда не удалось правильно зафиксировать / закрыть соединение на стороне отправителя. Сообщение будет видно при использовании консоли администратора, однако, пока недоступно для MDB.

Надеюсь, это поможет.

0 голосов
/ 28 ноября 2016

Я был свидетелем того же поведения, которое происходило после первой фиксации сеанса, то есть перед сообщениями, которые были получены правильно. В моем случае проблема заключалась в том, что я заново создавал получателя, сохраняя тот же сеанс. Как указано в этой статье :

Создание временных пунктов назначения, потребителей, производителей и связей все синхронные операции запрос-ответ с брокером и т.д. следует избегать для обработки каждого запроса, так как это приводит к большому количеству общаться с JMS-брокером.

Решение было так же просто, как повторно использовать тот же приемник.

0 голосов
/ 03 октября 2009

Этот код выполняется в appserver? Если это произойдет, я получу необходимые объекты с помощью аннотаций, а для получателя сообщений я бы использовал MDB. Если это кусок автономного кода, у меня было чертовски много времени на то, чтобы заставить работать клиент на основе JNDI, я вернулся к использованию «сырого» Java API.

...