1

我有一个关于 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  ();                                                                      
  }
4

2 回答 2

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 模式并确认您想要的消息。在这种情况下,应用程序必须具有根据内容识别消息的逻辑。虽然不是理想的设计。

于 2013-06-24T05:01:45.357 回答
1

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

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

于 2013-06-19T15:34:09.137 回答