要求在选择路由器中测试对象存储是否包含密钥
<objectstore:config name="storeDownload" doc:name="ObjectStore" persistent="false" partition="test"/>
<choice>
<when expression="#[app.registry.storeDownload.contains('#[flowVars.startKey]').equals('false')]">
收到错误 1.表达式评估器“注册表”表达式“ON”返回null但需要一个值。 (org.mule.api.expression.ExpressionRuntimeException) org.mule.expression.RegistryExpressionEvaluator:101(http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/expression/ExpressionRuntimeException.html) 2.无法调用商店。消息有效内容的类型为:byte [](org.mule.api.MessagingException)
答案 0 :(得分:3)
主要问题是您正在将MEL嵌入到无法工作的MEL中。另外,boolean-as-string比较是狡猾的。
替换它:
#[app.registry.storeDownload.contains('#[flowVars.startKey]').equals('false')]
与此:
#[!(app.registry.storeDownload.contains(flowVars.startKey))]
答案 1 :(得分:0)
我的用例与Nazar有点不同我需要监控长时间运行的过程,这可能需要长达四个小时。
在第一个流程中,我生成一个带有时间戳的键值作为有效负载,然后使用它将ProcessState设置为静态值&#39; Started&#39;在ObjectStore中,如下所示。之后我用四小时的延迟发射一个Quartz Outbound Endpoint。
<objectstore:store config-ref="MonitoredProcess" value-ref="#['Started']" key="#[payload]" doc:name="ObjectStore"/>
我得到了同样的例外。
在摸不着头脑和大量搜索后,变量的名称&#39; value- ref &#39;结合David的上述答案,最终揭示了我的问题,即总是为这个 ref 字段调用MEL。
一旦我将字段更改为表达#[&#39;已开始&#39;] 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"/>
为了完整性,我已经包含了从ObjectStore中检索ProcessState的代码。注意defaultValue- ref 也需要使用MEL
array(
[0] => Array
(
[IdRedeemProduct] => Item-A
[RedeemOptions] => Array
(
[0] => Array
(
[Points] => 1000
)
[1] => Array
(
[Points] => 2000
)
[2] => Array
(
[Points] => 43000
)
)
[ProductType] => 1
)
[1] => Array
(
[IdRedeemProduct] => Item-B
[RedeemOptions] => Array
(
[0] => Array
(
[Points] => 6200
)
[1] => Array
(
[Points] => 53000
)
)
[ProductType] => 1
)
)