我用HornetQ实现了spring jms。如果它是一个应用程序服务器HornetQ它完美的工作。但是,如果两个应用程序服务器正在访问HornetQ。我不工作。为了识别我引入clientId的不同服务器,它仍然不起作用。这是我的流程。
使用带有相关ID的clientId(发送消息的唯一serverId)准备发送消息,并使用ProducerCallback将其发送到带有Quename'Q1'的HorentQ并等待响应。
request.setStringProperty("clientId", clientId);
request.setJMSCorrelationID(correlationId);
在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);
在发件人方面,我还有另一个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>
当一个服务器被包含时,代码工作正常。但是第二个服务器的消息永远不会被该服务器中的侦听器接收,它会侦听Q2(正如我在HornetQ的JConsole中看到的那样)。这是发生的事情。
Server1向Q1发送消息,消费者接收消息处理它并将其置于Q2,Server1通过选择clientId server1上的消息从Q1接收消息。但是,当Server2将消息发送到Q1并且消费者接收消息处理它并将其发送到Q2时。
但是,Server2侦听器无法基于clientId server2选择消息。当我重新启动服务器并开始使用server2进行测试时,notw server2正常工作,但server1没有接收到该消息。
答案 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>