与此讨论类似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>
感谢您提前提供任何帮助
答案 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,允许您在执行其他消息处理器时保留原始消息:
如果您必须等待子流程完成,因为您需要使用子流程生成的信息,请像这样使用message enricher。一旦子流完成处理消息,该示例将变量“授权”分配给有效载荷。
<enricher target="#[variable:authorized]">
<flow-ref name="checkAuthorization" />
</enricher>
如果在允许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>