0

Mule で foreach コンポーネントを使用しています。Foreach を使用してコレクション オブジェクトを反復しています。ForEach コンポーネントについては、コレクション ペイロードを入力として送信しています。Foreach はコレクション ペイロードを反復します。しかし問題は、次のコンポーネントで Iterated foreach ペイロードを取得できないことです。

ここに私のコードSnippnetがあります

    <choice doc:name="Choice">
        <when expression="#[ognl:instance=='Lamp']">
            <processor-chain>
                <message-properties-transformer scope="invocation" doc:name="Message Properties">
                    <add-message-property key="loops" value="0"/>
                </message-properties-transformer>
                <component class="com.Lamp" doc:name="Java"/>
                <foreach doc:name="Foreach">
                    <component class="com.Candle" doc:name="Java"/>
                    <logger message="DDD #[message:payload]" level="INFO" doc:name="Logger"/>
                    <set-variable variableName="foreachPayload" value="#[message:payload]" doc:name="Payload"/>
                </foreach>
            </processor-chain>
        </when>

ここでは foreach コンポーネントのペイロードを直接取得できないため、そのペイロードを「foreachPayload」という名前の変数に設定しようとしました。しかし、次のコンポーネントで変数にアクセスしている間、反復されたコレクション オブジェクトの最後の値は、反復されたコレクション オブジェクトの値全体ではありません。

セッション変数にアクセスするコード スニペットを次に示します。

 eventContext.getMessage().getInvocationProperty("foreachPayload")

ここで何が問題なのか、これを解決する方法をお知らせください。

以下は私のメッセージフローのスクリーンショットです

http://i.stack.imgur.com/mm64s.jpg

4

1 に答える 1

1

foreachコンポーネントの後に変数のコレクションの最後の値を取得する理由は、元のメッセージの値をset-variable上書きするためです。foreachPayloadこれは正しい動作です。多分あなたはcollection-splitter代わりに使うべきforeachです。コレクション内のすべての要素を処理した後、を使用しますcollection-aggregator。このようにして、結果のペイロードは処理された値のコレクションになります。

<collection-splitter enableCorrelation="IF_NOT_SET"/>
<component class="com.Candle" doc:name="Java"/>
<collection-aggregator timeout="6000" failOnTimeout="false"/>
于 2012-07-26T23:38:21.923 に答える