是否需要测试对象存储的要求,无论是否包含键是否在选择路由器中
<objectstore:config name="storeDownload" doc:name="ObjectStore" persistent="false" partition="test"/>
<choice>
<when expression="#[app.registry.storeDownload.contains('#[flowVars.startKey]').equals('false')]">
获取错误1.表达式评估器"注册表"带有" extress"上的"返回" null,但需要一个值。(org.mule.api.expression.expressionruntimeException) org.mule.expression.RegistryExpressionEvaluator:101(http://www.mulesoft.org/docs/site/site/current3/apidocs/org/mule/mule/mule/api/api/api/expression/expression/expression/expressionruntimeRuntimeException.html)2.无法调用商店。消息有效负载是类型:字节[](org.mule.api.messagingException)
主要问题是您将MEL嵌入了MEL中,而Mel无法正常工作。
也是狡猾的布尔值比较。替换此:
#[app.registry.storeDownload.contains('#[flowVars.startKey]').equals('false')]
与此:
#[!(app.registry.storeDownload.contains(flowVars.startKey))]
我的用例与纳扎尔的用例有所不同,我需要监视长期运行过程,该过程可能需要四个小时。
在第一个流中,我在有效载荷中生成一个带有时间戳的键值,然后使用它将processState设置为静态值,如下所示。之后,我以四个小时的延迟点火了石英站出终点。
<objectstore:store config-ref="MonitoredProcess" value-ref="Started" key="#[payload]" doc:name="ObjectStore"/>
<quartz:outbound-endpoint jobName="ProcessMonitor" responseTimeout="10000" doc:name="Quartz"
repeatInterval="0" repeatCount="0" startDelay="${process.monitor.event.start.delay}">
<quartz:scheduled-dispatch-job>
<quartz:job-endpoint address="vm://processMonitorQueue"/>
</quartz:scheduled-dispatch-job>
</quartz:outbound-endpoint>
我得到了同样的例外。
在刮擦我的头并进行了大量搜索后,将变量"值 - ref>"的名称与上面的大卫答案结合在一起,最终揭示了我的问题,即梅尔总是被调用的 ref字段。
一旦我将字段更改为表达式#['start'],梅尔可以评估我的问题就消失了。
<objectstore:store config-ref="MonitoredProcess" value-ref="#['Started']" key="#[payload]" doc:name="ObjectStore"/>
为了完整性,我包含了从对象存储中检索ProcessState的代码。注意DefaultValue- Ref 还需要使用MEL
<vm:inbound-endpoint exchange-pattern="one-way" path="processMonitorQueue" doc:name="VM" />
<objectstore:retrieve config-ref="MonitoredProcess" defaultValue-ref="#['DoesNotExist']" key="#[payload]" targetProperty="processState" doc:name="ObjectStore"/>