我有一個在隊列中發送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