我想在使用集合聚合器聚合它们之前对来自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](见跟踪)] [近:{...未知 ....}] ^ [Line:1,Column: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.执行表达式“message.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) -------------------------------------------------- ------------------------------ Root异常堆栈跟踪:java.lang.ClassCastException: [Lorg.mule.api.MuleEvent;无法转换为java.util.Map org.mvel2.optimizers.impl.refl.nodes.MapAccessor.getValue(MapAccessor.java:42)at 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>
我添加了一个echo组件,它们在那时排序,所以我很确定聚合器是在解析它们。
答案 0 :(得分:3)
您是对的,相关序列属性名为MULE_CORRELATION_SEQUENCE
。您可以按照以下所示进行设置:
<set-property propertyName="MULE_CORRELATION_SEQUENCE"
value="1" />
然后,重定序器应该根据该序列对消息进行排序。如果没有,请使用失败的配置更新您的问题。
确保将MULE_CORRELATION_GROUP_SIZE
属性设置为正确的大小,并且要重新排序的所有消息共享相同的MULE_CORRELATION_ID
属性。