我正在使用Objectstore模块来跟踪文档的修订号和时间戳。下面的子流将出站属性“thisTimestamp”设置为新的Date()。
<sub-flow name="set_revision_and_timestamp" doc:name="set_revision_and_timestamp">
<enricher doc:name="Message Enricher" target="#[flowVars['OSrecordExists']]" >
<objectstore:contains config-ref="My_Objectstore" key="#[message.outboundProperties['dbDatabase'] + message.outboundProperties['dbCollection']]" doc:name="Contains"/>
</enricher>
<choice doc:name="Choice" >
<when expression="#[flowVars['OSrecordExists'] == false]">
<!-- create a new record with rev num 1 -->
<objectstore:store config-ref="My_Objectstore" key="#[message.outboundProperties['dbDatabase'] + message.outboundProperties['dbCollection']]" value-ref="#[['revision' : 1, 'timestamp' : new Date()]]" doc:name="Store"/>
<enricher doc:name="Message Enricher">
<objectstore:retrieve config-ref="My_Objectstore" key="#[message.outboundProperties['dbDatabase'] + message.outboundProperties['dbCollection']]" doc:name="Retrieve"/>
<enrich target="#[message.outboundProperties['thisRevision']]" source="#[payload.revision]" />
<enrich target="#[message.outboundProperties['thisTimestamp']]" source="#[payload.timestamp]" />
</enricher>
</when>
<otherwise>
<!-- retrieve the record, increment the rev num by 1 and update timestamp, and update the record -->
<enricher doc:name="Message Enricher">
<objectstore:retrieve config-ref="My_Objectstore" key="#[message.outboundProperties['dbDatabase'] + message.outboundProperties['dbCollection']]" doc:name="Retrieve"/>
<enrich target="#[message.outboundProperties['thisRevision']]" source="#[payload.revision]" />
<enrich target="#[message.outboundProperties['thisTimestamp']]" source="#[payload.timestamp]" />
</enricher>
<set-property propertyName="thisRevision" value="#[message.outboundProperties['thisRevision'] + 1]" doc:name="Increment Rev#"/>
<set-property propertyName="thisTimestamp" value="#[new Date()]" doc:name="New timestamp"/>
<objectstore:store config-ref="My_Objectstore" key="#[message.outboundProperties['dbDatabase'] + message.outboundProperties['dbCollection']]" overwrite="true" value-ref="#[['revision' : message.outboundProperties['thisRevision'], 'timestamp' : message.outboundProperties['thisTimestamp']]]" doc:name="Store"/>
</otherwise>
</choice>
</sub-flow>
然后使用ActiveMQ将消息发送到JMS出站端点,并由另一个ActiveMQ JMS入站端点接收。记录器显示该属性已在出站范围thisTimestamp=Thu Jan 02 15:04:08 EST 2014
上设置,但相应的入站范围属性为null。是什么给了什么?
编辑添加:有趣的是,当我检查AMQ队列上的消息时,thisTimestamp
属性也未设置。
答案 0 :(得分:0)
如果您正在浏览<when>
路径,那么这是预期的行为,因为属性不会在更丰富的范围之外传播:
http://www.mulesoft.org/docs/site/current/apidocs/org/mule/enricher/MessageEnricher.html
实现增强资源的消息处理器是 调用当前消息的副本以及任何流或 存在的会话变量。调用此消息 处理器是在主流的单独上下文中完成的 修改消息(及其属性和附件)或 流量或会话变量不会反映在流量所在的位置 配置了richher。
答案 1 :(得分:0)
在用户John Stegeman的Mule社区论坛上复制我收到的正确答案:
它似乎应该有效。我拿了一个使用ActiveMQ队列的流程,然后尝试了。日期没有显示。如果我toString()它的日期。
看一下JMS规范解决了这个谜团:
http://docs.oracle.com/javaee/1.4/api/javax/jms/Message.html告诉我们:
属性值可以是boolean,byte,short,int,long,float,double和String。
这就是原因。你不能使用日期。