2016-01-23 4 views
0

Я отправляю сообщения в очередь JMS. Каковы возможные способы поиска конкретного сообщения в очереди для потребления?Как найти конкретное сообщение в очереди JMS

Я пробовал следующим образом: я устанавливаю JMSCorrelationID при отправке сообщения в очередь:

public void createDQueue(String queuename, String json, Integer userid) { 
      try { 

       QueueSession.AUTO_ACKNOWLEDGE); 
       Queue queue = session.createQueue(queuename); 
       ObjectMessage objectMessage = session.createObjectMessage(); 
       objectMessage.setJMSCorrelationID(String.valueOf(userid)); 
       objectMessage.setObject(json); 
       session.createSender(queue).send(objectMessage); 
       session.close(); 
       connection.close(); 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
     } 

В потребительском коде я хочу получить, что конкретное сообщение на основе JMSCorrelationID. Я не могу получить это сообщение. Можете ли вы предложить решение?

public void getSpecificMessage(String queuename, Integer userid) { 

     try { 
      QueueConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
       ((ActiveMQConnectionFactory) connectionFactory).setUseAsyncSend(true); 
       QueueConnection connection = connectionFactory.createQueueConnection(); 
       connection.start(); 
       QueueSession session = connection.createQueueSession(false, 
        QueueSession.AUTO_ACKNOWLEDGE); 
       String id = String.valueOf(userid); 
      Queue queue = session.createQueue(queuename); 
      QueueReceiver receiver = session.createReceiver(queue, "JMSCorrelationID="+id); 
      Message message = receiver.receive();    
     } catch (JMSException e) {    
      e.printStackTrace(); 
     } 
     } 
+0

Я думаю, что вы допустили ошибку при отправке кода ... Первый блок кода неверен. Вы можете нажать ссылку «изменить» под своим вопросом, чтобы исправить это в своем вопросе. –

ответ

2

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

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

+0

Спасибо за предложение @Tim Bish, на данный момент у моей очереди 10 сообщений для тестирования, и мне нужно получить конкретное сообщение. Я, конечно же, смогу настроить maxPageSize позже. Теперь я использую: String id = String.valueOf (tid); .setStringProperty ("abc", id); (Режиссер). при потреблении я получаю проблему здесь: session.createConsumer (queue, "abc =" + id) ". Если я прямо передаю значение tid, как session.createConsumer (queue, "abc = '11 '"), я могу потреблять. Итак, как мне передать значение моего идентификатора? Пожалуйста, скажите мне правильный путь передачи id. – msk

1

Просто оберните значение идентификатора в одинарные кавычки

"JMSCorrelationID='"+id+"'" 

Эта функция не рекомендуется использовать, есть намного больше осложнений, как объяснена Тима, но если вы хотите obsolutely работу с ним внести изменения

0

Вы можете искать сообщения, используя сообщение MeessageID. Это было бы быстро, поскольку провайдеры обмена сообщениями индексировали сообщения на идентификаторе сообщения. Есть другой способ поиска на основе CorrelationId, метаданных и т. Д.

Но, пожалуйста, помните, что основной целью использования поставщика сообщений является подключение приложений в автономном режиме. Получающее приложение должно получать сообщения как можно скорее. Если сообщения накапливаются в очереди, это указывает на проблему, которая должна быть устранена.

+0

в моем случае есть разные пользователи, которые отправляют сообщения в очередь, поэтому мне нужно определить, к кому (пользователю) принадлежит идентификатор сообщения. Тогда я думаю, что мне нужно поддерживать пару значений ключа, указывающую идентификатор пользователя и соответствующий messageid и поиск оттуда. Скажите, пожалуйста, правильно ли это? или любую другую альтернативу получить конкретное сообщение, а также увидеть мой комментарий к Тиму Бишу. – msk

+0

Не уверен в вашей бизнес-логике. Но я не считаю, что вам нужно искать сообщения. Я бы предпочел получать сообщения без какого-либо селектора, а затем применить бизнес-логику к полученному сообщению. – Shashi