2013-12-09 115 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收到該消息,則不會由其他未訂閱此隊列的偵聽器接收。