我有一个代码,将读取器挂在队列上,并在方法完成时接收消息。我想不是从队列的开头接收消息,而是从队列的末尾或中间接收消息
private void getMessage() throws JMSException, NamingException {
Queue queue = (Queue) initialContext.lookup("dynamicQueues/" + "TestQueue");
if (messageConsumer == null){
messageConsumer = queueSession.createConsumer(queue);
}
TextMessage message = (TextMessage) messageConsumer.receive();
String msgBody = ((TextMessage) message).getText();
System.out.println(msgBody);
}
JMS 队列的基本语义是先进先出(即 FIFO)。换句话说,代理必须按照消息添加到队列的顺序将消息分派给消费者。但是,有两种基本方法可以解决这个问题。
JMS 消息可以具有从 0 到 9 的优先级。优先级由发送消息的生产者设置。代理可能会在优先级较低的消息之前将优先级较高的消息分派给消费者。
JMS 消费者可以指定消息选择器。只有与选择器匹配的消息才会被发送给消费者。这些消息将按照相对于彼此的 FIFO 顺序进行分派,但它们可能会跳到原本在它们之前分派的其他消息之前。选择器仅作用于消息的标头或属性,因此消费者必须了解其想要使用的消息的一些信息。
例如,如果生产者发送了 100 条消息,并且每条消息都有一个属性
myProperty
,其值按顺序为 1 到 100,并且消费者想要消费队列中的 last 消息,那么它将使用选择器 myProperty = 100
.
选择器语法基于 SQL92 条件表达式语法的子集。您可以在 API 文档中找到有关选择器及其工作原理的更多信息。