0

コレクションアグリゲーターを使用してそれらを集約する前に、jdbc クエリからのメッセージをソートしたいと思います。これを行う最良の方法はリシーケンサーだと思います。この行を追加すると

<resequencer timeout="6000" failOnTimeout="false" />

ワークフローで次のエラーが発生します。

** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ****メッセージ : 式 "message.payload.INVOICE_NUMBER" の実行に失敗しました。(org.mule.api.expression.ExpressionRuntimeException)。メッセージ ペイロードのタイプ: MuleEvent[] コード: MULE_ERROR--2 ----------------------------------- --------------------------------------------- 例外スタック: 1 [Lorg.mule.api.MuleEvent; java.util.Map にキャストできません (java.lang.ClassCastException)
org.mvel2.optimizers.impl.refl.nodes.MapAccessor:42 (null) 2. [エラー: getter を呼び出せません: getPayload [declr.class: org.mule.el.context.MessageContext; act.class: org.mule.el.context.MessageContext] (トレースを参照)] [近く: {... 不明 ....}] ^ [行: 1、列: 0] (org.mvel2.CompileException) org.mvel2.optimizers.impl.refl.nodes.GetterAccessor:75 (null) 3. 式「message.payload.INVOICE_NUMBER」の実行に失敗しました。(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) 4. 式「メッセージの実行」 .payload.INVOICE_NUMBER" が失敗しました。(org.mule.api.expression.ExpressionRuntimeException)。メッセージ ペイロードのタイプ: MuleEvent[] (org.mule.api.transformer.TransformerMessagingException)
org.mule.transformer.AbstractTransformer:123 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerMessagingException.html) ---------- -------------------------------------------------- -------------------- ルート例外スタック トレース: java.lang.ClassCastException: [Lorg.mule.api.MuleEvent; org.mvel2.optimizers.impl.refl.nodes.MapAccessor.getValue(MapAccessor.java:42) で java.util.Map にキャストできません org.mvel2.optimizers.impl.refl.nodes.GetterAccessor.getValue(GetterAccessor) .java:41) org.mvel2.optimizers.impl.refl.nodes.VariableAccessor.getValue(VariableAccessor.java:38) で + 3 つ以上 (デバッグ レベルのログ記録または '-Dmule.verbose.exceptions=true' をすべてに設定)


<when expression="#[message.payload.LHF_INVOICE_METHOD == 'EDI']"><processor-chain>
        <message-properties-transformer doc:name="Set Correlation ID">
            <add-message-property key="MULE_CORRELATION_SEQUENCE" value="#[message.payload.INVOICE_NUMBER]" />
        </message-properties-transformer>
<resequencer timeout="6000" failOnTimeout="false" />
<set-payload value="#[message.payload.INVOICE_NUMBER]" doc:name="EDI"/>                                
<collection-aggregator  timeout="3200" failOnTimeout="false" doc:name="EDI"          storePrefix="EDI" />
<smtp:outbound-endpoint host="mail.example.com" to="test@example.com" from="muleservice@example.com" subject="[Invoice Workflow] EDI" responseTimeout="10000" doc:name="EDI"/>
<collection-splitter doc:name="Collection Splitter"/>
<jdbc:outbound-endpoint exchange-pattern="one-way" queryKey="gMarkProcessedInRoss"     queryTimeout="1000" connector-ref="DatabaseMuleLogin" doc:name="Mark Processed in Ross">
</jdbc:outbound-endpoint>
</processor-chain>
</when>

リシーケンサー (以下) の後にスプリッターを追加しましたが、メッセージはまだ電子メールでソートされていないことを除いて機能します。

<set-property propertyName="MULE_CORRELATION_SEQUENCE" value="#[message.payload.INVOICE_NUMBER]" />
<resequencer timeout="6000" failOnTimeout="false" />
<collection-splitter doc:name="Collection Splitter"/>
<set-payload value="#[message.payload.message.payload.INVOICE_NUMBER]" doc:name="EDI"/>
<echo-component doc:name="Echo"/>                                
<collection-aggregator  timeout="3200" failOnTimeout="false" doc:name="EDI"  storePrefix="EDI"       />
<smtp:outbound-endpoint host="mail.example.com" to="test@example.com" from="muleservice@example.com" subject="[Invoice Workflow] EDI" responseTimeout="10000" doc:name="EDI"/>
<collection-splitter doc:name="Collection Splitter"/>
<jdbc:outbound-endpoint exchange-pattern="one-way" queryKey="RouteEDI" queryTimeout="1000" connector-ref="DatabaseMuleLogin" doc:name="Mark Processed in Ross">
</jdbc:outbound-endpoint>

エコー コンポーネントを追加したところ、その時点で並べ替えられているので、アグリゲーターが並べ替えを解除していると確信しています。

4

1 に答える 1

3

正解です。相関シーケンス プロパティの名前はMULE_CORRELATION_SEQUENCEです。次のように設定できます。

<set-property propertyName="MULE_CORRELATION_SEQUENCE"
              value="1" />

リシーケンサーは、そのシーケンスに基づいてメッセージを並べ替える必要があります。そうでない場合は、失敗した構成で質問を更新してください。

プロパティを適切なサイズに設定し、再シーケンスするすべてのメッセージが同じプロパティMULE_CORRELATION_GROUP_SIZEを共有していることを確認してください。MULE_CORRELATION_ID

于 2013-01-14T22:10:30.480 に答える