1
votes

Having a requirement to test a object store whether it contains a key or not in a choice router

<objectstore:config name="storeDownload" doc:name="ObjectStore" persistent="false" partition="test"/>

      <choice>
         <when  expression="#[app.registry.storeDownload.contains('#[flowVars.startKey]').equals('false')]">

Getting an error 1. Expression Evaluator "registry" with expression "ON" returned null but a value was required. (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. Failed to invoke store. Message payload is of type: byte[] (org.mule.api.MessagingException)

2

2 Answers

3
votes

The main issue is that you are embedding MEL into MEL which can't work. Also the boolean-as-string comparison is dodgy.

Replace this:

#[app.registry.storeDownload.contains('#[flowVars.startKey]').equals('false')]

with that:

#[!(app.registry.storeDownload.contains(flowVars.startKey))]
0
votes

My use case was a bit different to Nazar's I needed to monitor a long running process which can take up to four hours.

In the first flow I generate a key value with a time stamp in it as the payload and then use it to set the ProcessState to the static value 'Started' in an ObjectStore as shown below. After which I fire a Quartz Outbound Endpoint with a four hour delay.

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

And I got the same exception.

After scratching my head and lots of searches the name of the variable 'value-ref' in combination with David's answer above finally revealed my problem namely the MEL is always invoked for this ref field.

As soon as I changed the field to an expression #['Started'] that MEL could evaluate my problem went away.

<objectstore:store config-ref="MonitoredProcess" value-ref="#['Started']" key="#[payload]" doc:name="ObjectStore"/>

For completeness I've included the code that retrieves the ProcessState from the ObjectStore. Note the defaultValue-ref also needs to use 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"/>