2016-01-23 86 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(隊列「abc = '11」「)。那麼,我應該如何傳遞我的id值呢?請告訴我通過身份證的正確方法。 – msk

1

在單引號

"JMSCorrelationID='"+id+"'" 

只是包裝id的值不推薦使用此功能被使用,還有由添解釋很多併發症多,但如果你想obsolutely與它的工作做出改變

0

您可以使用消息的MeessageID搜索消息。這將消息提供者索引消息ID上的消息的速度很快。還有其他方式可以根據CorrelationId,元數據等進行搜索。

但請記住,使用消息傳遞提供程序的主要目標是以獨立於時間的方式連接應用程序。接收應用程序必須儘快收到消息。如果消息堆積在隊列中,則表明存在必須解決的問題。

+0

在我的情況下,有不同的用戶將消息發送到隊列,所以我需要確定消息ID屬於誰(用戶)。然後我認爲我需要維護一個關鍵值對,指示用戶標識和相應的messageid並從那裏搜索。請告訴我,這是正確的做法嗎?或任何其他替代方法來獲得特定的信息,並看到我對蒂姆比什的評論。 – msk

+0

不確定你的業務邏輯。但我不相信你需要搜索消息。我寧願接收沒有任何選擇器的消息,然後在接收到的消息上應用業務邏輯。 – Shashi