Java 使用选择器从队列读取jms消息

Java 使用选择器从队列读取jms消息,java,jms,ems,Java,Jms,Ems,我有一个java客户机,它在队列中发送jms消息(“队列请求”)。该消息包含一个int属性(“id”),其中包含唯一的客户端id号。消息正在处理中,然后落在另一个队列(“队列响应”)。如何让客户机等到具有其id的消息在队列中,然后读取它。 我曾尝试使用侦听器并实现onMessage,但如何在收到消息时停止侦听?JMS synchronous可以使用JMSReplyTo来实现。 使用相同会话发送原始消息时创建临时队列。 开始侦听临时队列并将原始消息JMSReplyTo设置为TMPQUE 使用Tem

我有一个java客户机,它在队列中发送jms消息(“队列请求”)。该消息包含一个int属性(“id”),其中包含唯一的客户端id号。消息正在处理中,然后落在另一个队列(“队列响应”)。如何让客户机等到具有其id的消息在队列中,然后读取它。
我曾尝试使用侦听器并实现onMessage,但如何在收到消息时停止侦听?

JMS synchronous可以使用JMSReplyTo来实现。 使用相同会话发送原始消息时创建临时队列。 开始侦听临时队列并将原始消息JMSReplyTo设置为TMPQUE

使用TempQueue Receiver.receive()使线程等待(同步)

完整的示例代码可以在中找到


在JMS中,您需要为队列指定侦听器,以便在发送消息时,选择特定的侦听器来接收消息。在Spring中,您可以在bean配置文件中指定侦听器,例如:

<bean id="myListener" class="mypackage.MyMessageListener" />

<bean id="queueBean" class="org.apache.activemq.command.ActiveMQTopic">
    <constructor-arg value="Queue-Request"/>
</bean>

<bean id="myListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="connectionFactoryBean" />
    <property name="destination" ref="queueBean" />
    <property name="messageListener" ref="myListener" />
</bean>

这将确保
MyMessageListener
将获得从队列发送的消息。请注意,队列是p2p的,因此如果消息由
MyMessageListener
接收,其他未订阅此队列的侦听器将不会收到此消息。

如果没有临时队列,而只有一个所有客户端都在侦听的队列,此解决方案会是什么样子呢?因此,我要寻找的是如何从一个大队列中异步提取发送给客户端的消息。但这对于同步消息传递非常有效。投票支持专为Asyc设计的winJMS,它不提供内置同步功能。您可以在JMSReplyTo的帮助下实现sycn。如果将目的地用作由n个客户端侦听的队列,则消息将不会传递给所有队列侦听器。因此,您只能使用“topic”作为JMSReplyTo的目的地。在客户端中,使用订阅服务器接收消息并验证ID。例如While(true){message message=…如果message.getText().equals(ID){Break;},则使用.receive()从主题接收消息
public class MyMessageListener implements MessageListener {
    public void onMessage(Message message) {
        //handle message here ...
    }   
}