带有2个监听器的JMS队列

时间:2013-06-19 15:27:48

标签: java jms jms-topic

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

2 个答案:

答案 0 :(得分:1)

您应该使用JMS选择器。每条JMS消息都可以包含您在发送方发起的属性。

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

答案 1 :(得分: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模式并确认所需的邮件。在这种情况下,应用程序必须具有基于内容识别消息的逻辑。虽然不是理想的设计。