[英]How to search for a particular message in JMS queue
我正在向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();
}
}
您的第一個問題是,您試圖將消息代理視為數據庫,您必須始終記住這一明智的建議:“消息代理不是數據庫”。
使用者或Queue瀏覽器可以進入目的地的深度有一定限制,在代理不會從磁盤中分頁更多消息之前,您需要檢查深度並查看深度是否大於maxPageSize設置並根據需要進行調整,但請記住,分頁的消息會保留在內存中直到被消耗。
只需將id值用單引號引起來
"JMSCorrelationID='"+id+"'"
不建議使用此功能,如Tim所述,還有很多復雜性,但是如果您要絕對使用它,請進行更改
您可以使用消息的MeessageID
搜索消息。 當消息傳遞提供者在消息ID上索引消息時,這將很快。 還有其他基於CorrelationId
,元數據等進行搜索的方法。
但是請記住,使用消息傳遞提供程序的主要目標是以時間獨立的方式連接應用程序。 接收應用程序必須盡快獲取消息。 如果消息堆積在隊列中,則表明必須解決的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.