5

ラバ フローに入ってくる SOAP リクエストがあります。ペイロードから情報を取得し、結果に応じて元のリクエストを別の jms キューにプッシュします。

ペイロードから必要な情報を取得するために、XSLT トランスフォーマーを使用しています (IDREF に基づいて要素から IDREF 属性を取得し、要素を取得してから IDREF オブジェクトから子要素を取得する必要があるため、XPath ではありません)。

XSLT 変換の結果に基づいて、choice 要素を使用して元のペイロードをプッシュします。元のペイロードをセッションに保存しています (インバウンドでも実行できます)。XSLT 変換後、選択ルーターを適用して適切なキューを見つけ、元のペイロードをキューにプッシュします (元のペイロードはセッション変数に格納されます)。<expression-component>エレメントを使用しています。以下は、mule-flow のスニペットです。

<flow name="ProcessXML121Order">
    <jms:inbound-endpoint queue="mviq.121.order" exchange-pattern="one-way" />
    <logger message="121 order payload is #[payload]" level="INFO" />
    <message-properties-transformer scope="session">
        <add-message-property key="mviPayload" value="#[payload]"/>
    </message-properties-transformer>
    <xm:xslt-transformer xsl-file="chooseVendor.xslt" />
    <logger message="After xsl file payload is #[payload]" level="INFO" />      
    <choice>
        <when expression="'EMSI'">
            <logger message="Vendor is EMSI" level="INFO" />
            <expression-component>payload=#[header:SESSION:mviPayload]</expression-component>
            <jms:outbound-endpoint queue="mviq.121.order.emsi" />
        </when>
        <when expression="'PRMD'">
            <logger message="Vendor is PRMD" level="INFO" />
            <jms:outbound-endpoint queue="mviq.121.order.prmd" />
        </when>
        <when expression="'RSA'">
            <logger message="Vendor is RSA" level="INFO" />
            <logger message="RSA payload is #[payload]" level="INFO" />
            <jms:outbound-endpoint queue="mviq.121.order.rsa" />
        </when>
        <otherwise>
            <logger message="Vendor is Error" level="INFO" />
            <logger message="Vendor error payload is #[payload]" level="INFO" />
            <jms:outbound-endpoint queue="mviq.error" />
        </otherwise>
    </choice>
</flow>

ペイロード=#[header:SESSION:mviPayload] を評価すると、次の例外がスローされます

[ProcessXML121Order.stage1.02] exception.AbstractExceptionListener (AbstractExceptionListener.java:296) - 
********************************************************************************
Message               : Execution of the expression "payload=#[header:SESSION:mviPayload]" failed. (org.mule.api.expression.ExpressionRuntimeException). Message payload is of type: byte[]
Code                  : MULE_ERROR-29999
--------------------------------------------------------------------------------
Exception stack is:
1. [Error: illegal use of operator: +]
[Near : {... Unknown ....}]
             ^
[Line: 1, Column: 0] (org.mvel2.CompileException)
  org.mvel2.ast.OperatorNode:46 (null)
2. Execution of the expression "payload=#[header:SESSION:mviPayload]" failed. (org.mule.api.expression.ExpressionRuntimeException)
  org.mule.el.mvel.MVELExpressionLanguage:211 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/expression/ExpressionRuntimeException.html)
3. Execution of the expression "payload=#[header:SESSION:mviPayload]" failed. (org.mule.api.expression.ExpressionRuntimeException). Message payload is of type: byte[] (org.mule.api.MessagingException)
  org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor:35 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/MessagingException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
[Error: illegal use of operator: +]
[Near : {... Unknown ....}]
             ^
[Line: 1, Column: 0]
    at org.mvel2.ast.OperatorNode.getReducedValueAccelerated(OperatorNode.java:46)
    at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)
    at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:105)
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************

2 つの質問があります。

  1. 元のペイロードを上書きするにはどうすればよいですか? (これが最善の方法だとは言いません)
  2. このシナリオでより良いアプローチは何ですか? 元のペイロードをそのままにして (この場合)、XSLT 出力を他の変数に保存することをお勧めしますか? どうやってやるの?それを達成するために使用できるパス (ミュールコンポーネント) は何ですか? 私は Mule を初めて使用するので、コミュニティのアドバイスを求めています。

お時間をいただきありがとうございます。

4

4 に答える 4

16

質問に答える前に、この壊れた式を書き直しましょう。

<expression-component>payload=#[header:SESSION:mviPayload]</expression-component>

なので:

<set-payload value="#[sessionVars.mviPayload]" />

以下も機能しますが、正当な理由もなくより複雑になります。

<expression-component>payload=sessionVars.mviPayload</expression-component>

これも:

<message-properties-transformer scope="session">
    <add-message-property key="mviPayload" value="#[payload]"/>
</message-properties-transformer>

次のように書くほうがよいでしょう:

<set-session-variable variableName="mviPayload" value="#[message.payload]" />

今あなたの質問に:

  1. 使用するset-payload
  2. XSL-T のようなトランスフォーマーは、現在のメッセージ ペイロードに自然に適用されるため、元のメッセージをプロパティに保存してから、メイン ペイロードを変換しても問題ありません。1 つだけ: セッション変数の代わりにフロー変数を優先します。実際、あなたの場合、このフローの外にある元のペイロードは必要ないと思うので、セッションに保存するのはやり過ぎです。

だから私はあなたが使用することをお勧めします:

<set-variable variableName="mviPayload" value="#[message.payload]" />

元のペイロードを保存し、次を再確立します。

<set-payload value="#[mviPayload]" />
于 2012-12-21T16:56:10.963 に答える
0

Set-Payload を使用して、上書きするデータを指定します。

于 2015-08-25T12:52:40.853 に答える