我有一个关于JMS队列的问题。
我已经实现了一个jms发送器/接收器,它使用一个共享队列作为我唯一可用的队列,也是我唯一可以使用的队列。
我现在面临的问题是,作为这个先到先服务的人,我不能保证我从生产者发送的消息将被我的消费者消费,而不是共享这个队列的另一个消费者,反之亦然。所以我正在使用其他应用程序的消息,它们也在使用我的消息。
有没有一种方法,我可以只监听我的消息,而不使用队列中的消息,或者这更像是一个主题实现?
或者,我可以显式地设置一个只有我的消费者才会选择的标识符。
我的主要代码:
public class AsyncReceiver implements MessageListener, ExceptionListener
{
public static void main(String[] args) throws Exception
{
//create queue factory
factory = new TibjmsQueueConnectionFactory(serverUrl);
//create queue connection
queueConn = factory.createQueueConnection(userName, password);
queueConn.setExceptionListener(this);
//create queue session
session = queueConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
//receive message by QueueReceiver
final Queue queue = session.createQueue(queueName);
final QueueReceiver queueReceiver = session.createReceiver(queue);
queueReceiver.setMessageListener(this);
queueConn.start ();
}发布于 2013-06-19 23:34:09
您应该使用JMS选择器。每个JMS消息都可以包含您在发送者端启动的属性。
消息消费者可以注册到JMS目的地(队列或主题),指定类似selector -SQL的语句来解释它想要使用哪些消息。因此,您可以指定特定于应用程序的属性,然后只接收相关消息。
发布于 2013-06-24 13:01:45
您可以使用消息选择器,如下所示
queueReceiver = queueSession.createReceiver(responseQueue,"JMSCorrelationID='“+ requestMessage.getJMSCorrelationID() +"'");
在这里,我使用JMS相关ID来标识我需要的正确消息。请注意,筛选器仅适用于邮件头和邮件属性。它不会对消息内容起作用。
有关邮件头和属性的详细信息:http://docs.oracle.com/javaee/1.4/tutorial/doc/JMS4.html#wp79367
如果需要根据邮件内容进行过滤,则可能需要使用QueueSession.MANUAL_ACKNOWLEDGE模式并确认所需的邮件。在这种情况下,应用程序必须具有根据内容识别消息的逻辑。虽然不是理想的设计。
https://stackoverflow.com/questions/17195246
复制相似问题