Mule Jms Request-Response in Topics

时间:2014-01-23 23:09:33

标签: request activemq response mule

对于一个项目,我必须在ActiveMQ主题上使用请求 - 响应模式,我知道回答某个主题不是一个好习惯,但不幸的是我必须这样做。 我的问题是,如果我在jms:output-endpoint使用exchange-pattern =“request-response”属性(发布请求消息),消息将被发布两次!因此,订阅者两次获得消息,并且还发送他的响应两次。

使用请求 - 响应路由器它可以工作(这意味着消息只发送一次)。 但我想使用自动生成的临时主题,所以我宁愿使用exchange-pattern =“request-response”而不是请求 - 响应路由器。

输出端点有两次发送消息的原因是什么? 如果没有其他可能使用请求 - 响应路由器,是否可以在那里生成临时主题?

我与发布商(mule.componentA)和订阅者(​​mule.componentB)制作了一个短程序,其中邮件发送两次:

<jms:activemq-connector brokerURL="tcp://localhost:61616" name="JMS_Connector" doc:name="Active MQ" specification="1.1" validateConnections="true" />

<flow doc:name="mule.componentA" name="mule.componentA">
    <http:inbound-endpoint host="localhost" port="8081" doc:name="HTTP" exchange-pattern="one-way" path="componentA" />
    <set-payload value="hello" doc:name="Set Payload"/>
    <logger message="componentA send: parameter: #[message.payload]" level="INFO" doc:name="Logger"/>
    <jms:outbound-endpoint connector-ref="JMS_Connector" doc:name="JMS"  exchange-pattern="request-response" topic="topic.test"/>
    <logger message="componentA received. message: #[message.payload]" level="INFO" doc:name="Logger" />
</flow>

<flow doc:name="mule.componentB" name="mule.componentB">
<jms:inbound-endpoint connector-ref="JMS_Connector" doc:name="JMS" exchange-pattern="one-way" topic="topic.test"/>
    <logger message="componentB received. message: #[message.payload]" level="INFO" doc:name="Logger" />
    <set-payload value="world" doc:name="Set Payload"/>
    <logger message="componentB send: message: #[message.payload]" level="INFO" doc:name="Logger"/>
</flow>

http:inbound-endpoint是启动流的触发器。我用firefox和curl尝试过,但没有什么不同。

输出结果为:

INFO 2014-01-21 16:12:29,760 [[request_response].mule.componentA.stage1.02] org.mule.api.processor.LoggerMessageProcessor: componentA send: parameter: hello 
INFO 2014-01-21 16:12:29,761 [[request_response].mule.componentA.stage1.02] org.mule.transport.service.DefaultTransportServiceDescriptor: Loading default outbound transformer: org.mule.transport.jms.transformers.ObjectToJMSMessage 
INFO 2014-01-21 16:12:29,762 [[request_response].mule.componentA.stage1.02] org.mule.transport.service.DefaultTransportServiceDescriptor: Loading default response transformer: org.mule.transport.jms.transformers.ObjectToJMSMessage 
WARN 2014-01-21 16:12:29,762 [[request_response].mule.componentA.stage1.02] com.mulesoft.mule.transport.jms.EeJmsMessageDispatcher: Starting patched JmsMessageReceiver 
INFO 2014-01-21 16:12:29,762 [[request_response].mule.componentA.stage1.02] org.mule.lifecycle.AbstractLifecycleManager: Initialising: 'JMS_Connector.dispatcher.191522199'. Object is: EeJmsMessageDispatcher 
INFO 2014-01-21 16:12:29,762 [[request_response].mule.componentA.stage1.02] org.mule.lifecycle.AbstractLifecycleManager: Starting: 'JMS_Connector.dispatcher.191522199'. Object is: EeJmsMessageDispatcher 
INFO 2014-01-21 16:12:29,822 [[request_response].mule.componentB.stage1.02] org.mule.api.processor.LoggerMessageProcessor: componentB received. message: hello 
INFO 2014-01-21 16:12:29,823 [[request_response].mule.componentB.stage1.02] org.mule.api.processor.LoggerMessageProcessor: componentB send: message: world 
INFO 2014-01-21 16:12:29,826 [[request_response].mule.componentB.stage1.02] org.mule.transport.service.DefaultTransportServiceDescriptor: Loading default outbound transformer: org.mule.transport.jms.transformers.ObjectToJMSMessage 
INFO 2014-01-21 16:12:29,828 [[request_response].mule.componentB.stage1.03] org.mule.api.processor.LoggerMessageProcessor: componentB received. message: hello 
INFO 2014-01-21 16:12:29,829 [[request_response].mule.componentB.stage1.03] org.mule.api.processor.LoggerMessageProcessor: componentB send: message: world 
INFO 2014-01-21 16:12:29,830 [[request_response].mule.componentB.stage1.03] org.mule.transport.service.DefaultTransportServiceDescriptor: Loading default outbound transformer: org.mule.transport.jms.transformers.ObjectToJMSMessage 
INFO 2014-01-21 16:12:29,832 [[request_response].mule.componentB.stage1.02] org.mule.transport.jms.JmsReplyToHandler: Reply Message sent to: temp-topic://ID:philipps-mbp-62486-1390317145516-1:1:1 with correlationID:ID:philipps-mbp-62486-1390317145516-1:1:3:1:1 
INFO 2014-01-21 16:12:29,833 [[request_response].mule.componentB.stage1.03] org.mule.transport.jms.JmsReplyToHandler: Reply Message sent to: temp-topic://ID:philipps-mbp-62486-1390317145516-1:1:1 with correlationID:ID:philipps-mbp-62486-1390317145516-1:1:3:1:2 
INFO 2014-01-21 16:12:29,837 [[request_response].mule.componentA.stage1.02] org.mule.api.processor.LoggerMessageProcessor: componentA received. message: world

1 个答案:

答案 0 :(得分:1)

我想说可能是ActiveMQ试图确保订阅者收到消息。我不太了解你想要在这里实现的目标。如果要将某些内容发布到JMS主题,则通常会向多个接收方广播消息,此时您尝试进行点对点消息传递。如果您不能将JMS队列与请求 - 响应交换模式一起使用,我建议您使用具有单向交换模式的主题,然后添加第三个流/主题以接收来自componentB的消息并将您的响应在那里处理逻辑。