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] (查看跟踪)] [Near : {... Unknown ....}] ^ [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) ---------- -------------------------------------------------- -------------------- 根异常堆栈跟踪:java.lang.ClassCastException:[Lorg.mule.api.MuleEvent; 不能在 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 回答