我有一个在队列中发送jms消息的java客户端(“队列请求”)。该消息包含一个int属性(“id”),其中包含唯一的客户端ID号。消息正在处理中,而不是在另一个队列中(“队列响应”)。如何让客户端等待,直到带有他的ID的消息在队列中,然后将其读出。 我曾尝试使用监听器并实现onMessage,但是如何在收到消息时停止监听?使用选择器从队列中读取jms消息
0
A
回答
1
JMS同步可以使用JMSReplyTo来实现。 使用同一会话发送原始消息时创建临时队列。 开始监听Temp Queue并将原始消息JMSReply设置为TmpQueue。
使用TempQueue Receiver.receive(),以使线程等待(同步)
完整的示例代码可在
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
收到该消息,则不会由其他未订阅此队列的侦听器接收。
相关问题
- 1. 错误从JMS消息获取队列
- 2. jms消息选择器
- 3. 有选择地从SQS队列读取消息
- 4. 使用多线程从JMS队列中消费消息
- 5. JMS队列接收消息?
- 6. win32:读取消息队列
- 7. 消息队列的选择?
- 8. 使用jms获取已使用的队列消息
- 9. 使用JMSMessageID从MQ队列中删除JMS消息
- 10. JMS:无法通过选择器从主题中选择jms消息
- 11. 阅读与从JMS队列中复制消息..使用logstash进入ES
- 12. 统计JMS队列中的消息数
- 13. 替换jms队列中的消息
- 14. JMS队列中的延迟消息
- 15. SOA复合NOT从JMS队列读取
- 16. JMS消息选择执行
- 17. 需要选择器的JMS队列
- 18. JMS选择器与单个队列
- 19. 我们如何知道哪个使用者从JMS队列中获取消息?
- 20. Mule中的JMS消息选择器使用日期
- 21. JMS无法使用使用spring/jms的Oracle队列中的消息
- 22. 使用camel指定从activemq队列读取消息的超时
- 23. 如何使用消息选择过滤消息在JMS
- 24. Java内部消息队列/ JMS
- 25. 发送XML消息给SONIC JMS队列
- 26. 在JMS队列上发布消息?
- 27. 在JMS队列上测试消息
- 28. JMS消息 - 与队列关联
- 29. JMS队列消息接收订单
- 30. JMS消息回滚到队列
此解决方案如何在没有临时队列的情况下进行查看,但只有一个客户端正在监听? – benst
所以我在寻找的是如何从一个大队列中异步地将消息发往客户端。但是这对于同步消息传递完美。投票赢了 – benst
JMS专为Asyc设计,它不提供同步作为内置功能。您可以在JMSReplyTo的帮助下实现sycn。如果您使用目标作为由n个客户端监听的队列,则该消息将不会被传送到所有的队列监听器。所以你必须只使用“主题”作为JMSReplyTo的目的地。并在客户端使用订阅者接收消息并验证ID。 Some thing like like While(true)Message message = ..使用.receive()接收来自主题的消息() If message.getText()。equals(id){ Break; } } – Mani