JMS消息选择器在多服务器环境中不起作用

时间:2014-06-27 08:19:52

标签: java spring jms hornetq spring-jms

我用HornetQ实现了spring jms。如果它是一个应用程序服务器HornetQ它完美的工作。但是,如果两个应用程序服务器正在访问HornetQ。我不工作。为了识别我引入clientId的不同服务器,它仍然不起作用。这是我的流程。

  1. 使用带有相关ID的clientId(发送消息的唯一serverId)准备发送消息,并使用ProducerCallback将其发送到带有Quename'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选择消息。

    <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>
    

  4. 当一个服务器被包含时,代码工作正常。但是第二个服务器的消息永远不会被该服务器中的侦听器接收,它会侦听Q2(正如我在HornetQ的JConsole中看到的那样)。这是发生的事情。

    Server1向Q1发送消息,消费者接收消息处理它并将其置于Q2,Server1通过选择clientId server1上的消息从Q1接收消息。但是,当Server2将消息发送到Q1并且消费者接收消息处理它并将其发送到Q2时。

    但是,Server2侦听器无法基于clientId server2选择消息。当我重新启动服务器并开始使用server2进行测试时,notw server2正常工作,但server1没有接收到该消息。

1 个答案:

答案 0 :(得分: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>
相关问题