维护骡子消息

时间:2014-09-18 11:00:24

标签: java http jersey mule

与此讨论类似Maintain Payload State during mule flow execution

我想知道如何在整个流程中维护整个Mule消息。 在收到用户被授权调用的信息后,我正在尝试调用jersey资源组件。在此授权请求中,有效负载和原始http请求被更改。

我的困境是我不想首先调用资源,因为这样效率低且不安全,但是我看不到任何其他合理的方法。

<flow name="test">
    <http:inbound-endpoint exchange-pattern="request-response" host="0.0.0.0" port="1234" path="test" doc:name="HTTP"/>
    <!-- sub-flow here which changes the MuleMessage and loses all original inbound properties -->

    <jersey:resources doc:name="REST">
        <component class="com.Test" />
    </jersey:resources>
</flow>

感谢您提前提供任何帮助

4 个答案:

答案 0 :(得分:1)

有多种方法可以保存骡子消息及其属性,以便在需要时可以检索它。在您的情况下,您可以将整个Mule消息保存在变量中并在需要时检索它,例如:

<flow name="test">
    <http:inbound-endpoint exchange-pattern="request-response" host="0.0.0.0" port="1234" path="test" doc:name="HTTP"/>
   <!-- You save your entire message in a session variable named entireMessage before calling a subflow-->
<set-session-variable variableName="entireMessage" value="#[message.payload]" />
 <!-- You can now call your Sub flow -->

    <jersey:resources doc:name="REST">
        <component class="com.Test" />
    </jersey:resources>
</flow>

在上面的流程中,您将Mule消息存储在名为 wholeMessage 的会话变量中。您可以随时随地在任何流中检索此会话变量的值,如下所示: -

<logger level="INFO" message="#[sessionVars['entireMessage']]"/>

这将打印出Mule消息

还有一种替代方式可以在更改之前存储http标头。 您还可以使用以下内容: -

<flow name="test">
 <http:inbound-endpoint exchange-pattern="request-response" host="0.0.0.0" port="1234" path="test" doc:name="HTTP"/>
       <!-- You copy all the HTTP headers before calling a subflow-->
 <copy-properties propertyName="http.*" doc:name="Copy All HTTP Headers"/>  
  <!-- You can now call your Sub flow -->

   <jersey:resources doc:name="REST">
      <component class="com.Test" />
    </jersey:resources>
</flow>

上述流程将在调用任何其他流程之前复制所有HTTP标头

更新流量: -

如果您的Jersy组件需要原始未更改的有效负载,请使用原始有效负载覆盖 当前有效负载 使用设置有效负载组件

存储在会话变量中
 <flow name="test">
        <http:inbound-endpoint exchange-pattern="request-response" host="0.0.0.0" port="1234" path="test" doc:name="HTTP"/>
       <!-- You save your entire message in a session variable named entireMessage before calling a subflow-->
    <set-session-variable variableName="entireMessage" value="#[message.payload]" />
     <!-- You can now call your Sub flow -->

 <!-- overwrite current payload with original unaltered payload -->   
<set-payload value="#[sessionVars['entireMessage']]" doc:name="Set Payload"/>
        <jersey:resources doc:name="REST">
            <component class="com.Test" />
        </jersey:resources>
    </flow>

答案 1 :(得分:1)

Mule 3包含两个scopes,允许您在执行其他消息处理器时保留原始消息:

  1. 如果您必须等待子流程完成,因为您需要使用子流程生成的信息,请像这样使用message enricher。一旦子流完成处理消息,该示例将变量“授权”分配给有效载荷。

    <enricher target="#[variable:authorized]"> <flow-ref name="checkAuthorization" /> </enricher>

  2. 如果在允许Jersey资源运行之前不需要等待子流程完成,请使用async范围,如下所示:

    <async> <flow-ref name="goForthAndDoSomething" /> </async>

答案 2 :(得分:0)

尝试这样的方法将原始邮件存储在会话中:

    <message-properties-transformer scope="session" doc:name="Save original message">
        <add-message-property key="originalMessage" value="#[message:payload]"></add-message-property>
    </message-properties-transformer>

然后尝试这样的事情从会话中获取它:

<expression-transformer evaluator="..." expression="SESSION:originalMessage" doc:name="Restore original message"></expression-transformer>

答案 3 :(得分:0)

感谢您的帮助。最终的解决方案答案是:

<flow name="test">
    <http:inbound-endpoint exchange-pattern="request-response" host="0.0.0.0" port="1234" path="test" doc:name="HTTP"/>

    <enricher target="#[variable:unwantedPayload]" source="#[payload]">
        <flow-ref name="anotherFlowCalled" />
    </enricher>

    <jersey:resources doc:name="REST">
        <component class="com.Test" />
    </jersey:resources>
</flow>