2013-06-19 78 views
1

我有一个关于JMS队列的问题。JMS队列与2个监听器

我已经实现了一个jms发送器/接收器使用共享队列作为唯一的队列avaialbe给我和唯一我可以使用。

我现在面临的问题是,我第一次服务的时候,我无法保证我从我的制作者发送的消息将被我的消费者使用,而不是其他人共享此队列,反之亦然。所以我正在消费其他应用程序的消息,他们正在消耗我的。

有没有一种方法,我可以只听我的消息,而不是从队列中消耗它们,或者这是更多的主题实现?

或者我可以明确地设置一个标识符,只有我的消费者才会拿起。

我的主要代码:

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 ();                  
    } 

回答

1

您应该使用JMS的选择。每个JMS消息都可以包含您在发件人端启动的属性。

消息使用者可以注册到指定选择器的JMS目标(队列或主题) - 类似SQL的语句,它解释了它要使用哪些消息。因此,您可以指定特定于应用程序的属性,然后只接收相关消息。

+0

感谢@AlexR的回应,您是否会举例说明我可以如何做到这一点?这是设置在消息本身,不一定是发件人的连接?在接收器上,选择器是在创建QueuReciever时指定的? '最终QueueReceiver queueReceiver = session.createReceiver(队列,“JMS_SELECTOR”);' – PMC2013

1

如下所示

的QueueReceiver = queueSession.createReceiver你可以使用消息选择(responseQueue, “JMSCorrelationID = '” + requestMessage.getJMSCorrelationID()+ “'”);

这里我使用JMS相关ID来标识我需要的正确消息。 请注意,该过滤器仅适用于消息头和消息属性。 它不适用于邮件内容。在邮件头&属性

详情:http://docs.oracle.com/javaee/1.4/tutorial/doc/JMS4.html#wp79367

如果您需要过滤根据邮件内容,您可能需要使用QueueSession.MANUAL_ACKNOWLEDGE模式,并确认您想要的信息。在这种情况下,应用程序必须具有根据内容识别消息的逻辑。虽然不是理想的设计。

+0

谢谢@ SMS Krishnan,至于你的例子你怎么知道requestMessage.getJMSCorrelationID(),当这真的是初始化的一部分?你有没有在发行商那边设置? – PMC2013