2014-06-27 73 views
0

我實現了Spring的JMS的一個HornetQ工作。它完美的工作如果它的一個應用程序服務器HornetQ。但是,如果兩個應用程序服務器正在訪問HornetQ。我不工作。爲了識別不同的服務器,我介紹了clientId,但它仍然不起作用。這是我的流程。JMS消息選擇不會在多服務器環境

  1. 準備消息與發送的clientId(其發送消息獨特SERVERID)與相關性id並將其與Quename與接口ProducerCallback「Q1」發送到HorentQ並等待響應。

    request.setStringProperty("clientId", clientId); 
    request.setJMSCorrelationID(correlationId); 
    
  2. 在Consumder身邊,我已經DefaultMessageListenerContainer將被監聽隊列Q1。一旦該消息被接收我處理它,並在響應對象設置correlaionId和的clientId回來了,它發送到另一個Q「Q2」

    final String clientId = request.getStringProperty("clientId"); 
    final String correlationId = request.getJMSCorrelationID(); 
    
    
    response.setJMSCorrelationID(correlationId); 
    response.setStringProperty("clientId", clientId); 
    
  3. 在發送端我有另一個DefaultMessageListenerContainer將被監聽Q2 。用消息選擇器來選擇基於clientId的消息。當一個服務器envolved

    <bean id="jmsContatiner" 
        class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
        <property name="messageSelector" value="clientId='server1'" /> 
        <property name="concurrency" value="1" /> 
        <property name="messageListener" ref="responseListener" /> 
        <property name="destinationName" value="Q2" /> 
        <property name="connectionFactory" ref="connectionFactory" /> 
    </bean> 
    

的代碼工作正常。但是第二臺服務器的消息永遠不會被該服務器中的偵聽器收到,它會監聽Q2(正如我在HornetQ的JConsole中看到的那樣)。這是發生了什麼。
服務器1發送消息給Q1和消費者接收消息進行處理,並把在Q2和服務器1通過的clientId server1的選擇信息從Q1接收該消息。但是,當Server2將消息發送給Q1並且消費者接收到消息時,它會對Q2進行處理。但是,Server2偵聽器無法選擇基於clientId server2的消息。當我重新啓動服務器並開始使用server2進行測試時,notw server2正常工作,但server1未收到消息。

任何幫助,非常感謝。

+0

是不是應該引用值?即'' – kan

+0

抱歉它是複製錯誤,值在引號內。在日誌中我可以看到clientId是server1或server2 –

回答

0

解決了該問題增加的緩存水平CACHE_CONNECTION和客戶端ID。它開始工作完美。

<bean id="jmsContatiner" 
    class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="messageSelector" value="clientId='server1'" /> 
    <property name="concurrency" value="1" /> 
    <property name="clientId" value="server1" /> 
    <property name="cacheLevel" value="1" /> 
    <property name="messageListener" ref="responseListener" /> 
    <property name="destinationName" value="Q2" /> 
    <property name="connectionFactory" ref="connectionFactory" /> 
</bean>