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