如何在不同流之间传播Mule关联ID或任何其他自定义属性

时间:2013-01-03 15:45:49

标签: mule

是否有办法在通过不同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

1 个答案:

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