JMS-клиент не получает сообщения

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

Я могу добавлять сообщения в очередь. Я могу видеть сообщения, используя объект QueueBrowser. Однако MessageConsumer (ни QueueReceiver) не может получить какое-либо сообщение и вернуть значение null. Срок действия сообщения установлен на 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...
         }

person Yaron Naveh    schedule 02.10.2009    source источник
comment
Какой код показать? Это может помочь вам узнать...   -  person Pascal Thivent    schedule 03.10.2009


Ответы (3)


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

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

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

person vdr    schedule 02.10.2009

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

person fvu    schedule 03.10.2009

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

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

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

person digital illusion    schedule 28.11.2016