2013-12-09 198 views
0

我有一个在队列中发送jms消息的java客户端(“队列请求”)。该消息包含一个int属性(“id”),其中包含唯一的客户端ID号。消息正在处理中,而不是在另一个队列中(“队列响应”)。如何让客户端等待,直到带有他的ID的消息在队列中,然后将其读出。 我曾尝试使用监听器并实现onMessage,但是如何在收到消息时停止监听?使用选择器从队列中读取jms消息

回答

1

JMS同步可以使用JMSReplyTo来实现。 使用同一会话发送原始消息时创建临时队列。 开始监听Temp Queue并将原始消息JMSReply设置为TmpQueue。

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

完整的示例代码可在

http://jmsexample.zcage.com/

+0

此解决方案如何在没有临时队列的情况下进行查看,但只有一个客户端正在监听? – benst

+0

所以我在寻找的是如何从一个大队列中异步地将消息发往客户端。但是这对于同步消息传递完美。投票赢了 – benst

+1

JMS专为Asyc设计,它不提供同步作为内置功能。您可以在JMSReplyTo的帮助下实现sycn。如果您使用目标作为由n个客户端监听的队列,则该消息将不会被传送到所有的队列监听器。所以你必须只使用“主题”作为JMSReplyTo的目的地。并在客户端使用订阅者接收消息并验证ID。 Some thing like like While(true)Message message = ..使用.receive()接收来自主题的消息() If message.getText()。equals(id){ Break; } } – Mani

0

发现在JMS,你需要指定的侦听器队列所以如果发送消息,则选择特定的监听器来接收消息。在春天,你可以指定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实现MessageListener接口:

public class MyMessageListener implements MessageListener { 
    public void onMessage(Message message) { 
     //handle message here ... 
    } 
} 

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