骡子:在Mule 3.5中的MEL中检索对象存储

时间:2015-05-07 11:32:24

标签: mule mule-studio mule-component mule-el

要求在选择路由器中测试对象存储是否包含密钥

<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)

2 个答案:

答案 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
        )
)