Java 如何在JMS队列中搜索特定消息
我正在向JMS队列发送一些消息。在队列中搜索要使用的特定消息的可能方式有哪些 我以以下方式进行了尝试:在向队列发送消息时,我正在设置Java 如何在JMS队列中搜索特定消息,java,jms,activemq,Java,Jms,Activemq,我正在向JMS队列发送一些消息。在队列中搜索要使用的特定消息的可能方式有哪些 我以以下方式进行了尝试:在向队列发送消息时,我正在设置JMSCorrelationID: public void createDQueue(String queuename, String json, Integer userid) { try { QueueSession.AUTO_ACKNOWLEDGE ); Queue que
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();
}
}
您的第一个问题是,您试图将MessageBroker视为一个数据库,您必须始终记住这条明智的建议,“MessageBroker不是一个数据库”
在代理不会从磁盘中分页更多消息之前,使用者或队列浏览器可以进入目标的深度有一定的限制,因此您需要检查深度,查看其是否大于maxPageSize设置,并根据需要进行调整,但请记住,在被使用之前,分页的消息将保留在内存中 您的第一个问题是,您试图将MessageBroker视为一个数据库,您必须始终记住这条明智的建议,“MessageBroker不是一个数据库”
在代理不会从磁盘中分页更多消息之前,使用者或队列浏览器可以进入目标的深度有一定的限制,因此您需要检查深度,查看其是否大于maxPageSize设置,并根据需要进行调整,但请记住,在被使用之前,分页的消息将保留在内存中 只需将id值用单引号括起来即可
"JMSCorrelationID='"+id+"'"
不建议使用此功能,正如Tim所解释的,会有更多的复杂情况,但是如果您想顽固地使用它,只需将id值用单引号括起来即可
"JMSCorrelationID='"+id+"'"
不建议使用此功能,正如Tim所解释的,会有更多的复杂情况,但是如果您想顽固地使用它进行更改,您可以使用消息的
MeessageID
搜索消息。这会很快,因为消息提供者会根据消息id索引消息。还有其他方法可以基于CorrelationId
、元数据等进行搜索
但请记住,使用消息传递提供程序的主要目标是以时间无关的方式连接应用程序。接收应用程序必须尽快获取消息。如果消息堆积在队列中,则表明存在必须解决的问题 您可以使用邮件的
MeessageID
搜索邮件。这会很快,因为消息提供者会根据消息id索引消息。还有其他方法可以基于CorrelationId
、元数据等进行搜索
但请记住,使用消息传递提供程序的主要目标是以时间无关的方式连接应用程序。接收应用程序必须尽快获取消息。如果消息堆积在队列中,则表明存在必须解决的问题 我认为你在发布代码时犯了一个错误。。。第一个代码块不正确。您可以单击问题下方的
编辑链接来更正问题中的问题。我认为您在发布代码时犯了错误。。。第一个代码块不正确。您可以单击问题下方的edit
链接来更正问题中的问题。感谢@Tim Bish的建议,到目前为止,我的队列有10条消息要测试,我必须获得特定消息。我一定会在以后调整我的maxPageSize。现在我使用的是,String id=String.valueOf(tid)。设置字符串属性(“abc”,id);(制片人)。消费时,我在这里遇到问题'session.createConsumer(队列,“abc=”+id')。如果我直接传递tid值,作为session.createConsumer(队列“abc='11'),我就可以使用它。那么,我应该如何传递id值呢?请告诉我传递id的正确方式。感谢@Tim Bish的建议,到目前为止,我的队列有10条消息要测试,我必须获得特定消息。我一定会在稍后调整我的maxPageSize。现在我使用的是,String id=String.valueOf(tid)。设置字符串属性(“abc”,id);(制片人)。消费时,我在这里遇到问题'session.createConsumer(队列,“abc=”+id')。如果我直接传递tid值,作为session.createConsumer(队列“abc='11'),我就可以使用它。那么,我应该如何传递id值呢?请告诉我传递id的正确方式。在我的情况下,有不同的用户向队列发送消息,所以我需要确定消息id属于谁(用户)。然后我想我需要维护一个键值对,指示userid和相应的messageid,并从那里进行搜索。请告诉我,这样做对吗?或任何其他选择,以获取具体信息,并查看我对Tim Bish的评论。不确定您的业务逻辑。但我不相信你需要搜索信息。我希望在不使用任何选择器的情况下接收消息,然后对接收到的消息应用业务逻辑。在我的情况下,有不同的用户向队列发送消息,因此我需要标识消息id属于谁(用户)。然后我想我需要维护一个键值对,指示userid和相应的messageid,并从那里进行搜索。请告诉我,这样做对吗?或任何其他选择,以获取具体信息,并查看我对Tim Bish的评论。不确定您的业务逻辑。但我不相信你需要搜索信息。我更喜欢在没有任何选择器的情况下接收消息,然后对接收到的消息应用业务逻辑。