如何在骡子消息上设置相关序列属性?

时间:2013-01-14 21:46:10

标签: mule

我想在使用集合聚合器聚合它们之前对来自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组件,它们在那时排序,所以我很确定聚合器是在解析它们。

1 个答案:

答案 0 :(得分:3)

您是对的,相关序列属性名为MULE_CORRELATION_SEQUENCE。您可以按照以下所示进行设置:

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

然后,重定序器应该根据该序列对消息进行排序。如果没有,请使用失败的配置更新您的问题。

确保将MULE_CORRELATION_GROUP_SIZE属性设置为正确的大小,并且要重新排序的所有消息共享相同的MULE_CORRELATION_ID属性。