是否有办法在通过不同JMS队列的消息中传播MULE_CORRELATION_ID
。我在OUTBOUND
元素中尝试了SESSION
,<message-properties-transformer>
范围但不起作用。对于其他自定义属性也是如此。
作为一种解决方法,我不得不在中间流中添加消息属性。
外观属性看起来像接收端点的入站范围。我们可以配置此行为
示例骡子流程:
<flow name="proxyService">
<http:inbound-endpoint address="${xxx.service.address}"
exchange-pattern="request-response">
<cxf:proxy-service wsdlLocation="classpath:xxx.wsdl"
namespace="http://xxxx.com/services/abc" service="ABCService" />
</http:inbound-endpoint>
<component class="com.xxxx.services.xxx.ABCServiceProxy" />
<choice>
<when evaluator="xpath" expression="fn:local-name(/*/*[1])='blah'">
<choice>
<when evaluator="xpath"
expression="//acord:TXLifeRequest/acord:TransType/@tc='121'">
<!-- this is asynchronous communication using correlation id -->
<message-properties-transformer scope="outbound">
<add-message-property key="MULE_CORRELATION_ID"
value="#[xpath://abc:XYZRequest/some ID]" />
</message-properties-transformer>
<request-reply >
<jms:outbound-endpoint queue="order.queue">
<message-properties-transformer scope="outbound"> <delete-message-property key="MULE_REPLYTO" />
</message-properties-transformer>
</jms:outbound-endpoint>
<jms:inbound-endpoint queue="status.queue" />
</request-reply>
</when>
<when evaluator="xpath"
<!-- other cases -->
</when>
<otherwise>
<!-- create failure response -->
<jms:outbound-endpoint queue="mviq.error.queue" />
</otherwise>
</choice>
</when>
<otherwise>
<!-- log -->
</otherwise>
</choice>
</flow>
<flow name="ProcessOrder">
<jms:inbound-endpoint queue="order.queue"
exchange-pattern="one-way" />
<!-- Storing the payload in another variable because xslt transformer will overwrite it -->
<set-variable variableName="xxxPayload" value="#[message.payload]" />
<xm:xslt-transformer xsl-file="xsl/something.xslt" />
<choice>
<when expression="'some string'">
<!-- Overwriting the current payload to original payload --> <set-payload value="#[xxxPayload]" />
<logger level="INFO"
message="payload before pushing to EMSI queue: #[payload]" />
<jms:outbound-endpoint queue="order.special.queue" />
</when>
<when expression="string 2">
<!-- other case -->
</when>
<when expression="'blah">
</when>
<otherwise>
<jms:outbound-endpoint queue="error.queue" />
</otherwise>
</choice>
</flow>
<flow name="ProcessingSpecialQueue">
<jms:inbound-endpoint queue="order.special.queue" />
<message-properties-transformer doc:name="Message Properties">
<add-message-property key="MULE_CORRELATION_ID" value="#some value" />
</message-properties-transformer>
.... more logic
</flow>
在将消息发送到MULE_CORRELATION_ID
之前已设置 order.queue
。现在我再次需要在order.special.queue
中设置它。现在,如果我需要将消息推送到第3个jms队列,再次需要设置它。
是否有一种方法可以将相关ID设置为一次,并期望它不会在后续队列中丢失。
我正在使用Mule 3.3.0
答案 0 :(得分:3)
有没有办法在通过不同JMS队列的消息中传播MULE_CORRELATION_ID。
这个应该自动完成:如果没有发生,你很可能会遇到错误。骡子版?允许重现问题的示例配置?
看起来出站属性最终在接收端点的入站范围内。
这是一个不是错误的功能:无法关闭它。
编辑我已经能够使用您的配置的精简版重现问题:
<jms:activemq-connector name="jmsConnector"
specification="1.1" />
<flow name="proxyService">
<http:inbound-endpoint address="http://localhost:8080/test" />
<set-property propertyName="MULE_CORRELATION_ID" value="custom_cid" />
<jms:outbound-endpoint queue="order.queue" />
</flow>
<flow name="ProcessOrder">
<jms:inbound-endpoint queue="order.queue" />
<logger message="--> ProcessOrder CID: #[message.correlationId]"
level="INFO" />
<jms:outbound-endpoint queue="order.special.queue" />
</flow>
<flow name="ProcessingSpecialQueue">
<jms:inbound-endpoint queue="order.special.queue" />
<logger message="--> ProcessingSpecialQueue CID: #[message.correlationId]"
level="INFO" />
</flow>
IMO Mule在这里做得不对,所以我把这个问题报告为错误:http://www.mulesoft.org/jira/browse/MULE-6577