2013-08-27 108 views
0

在Mule 3.3.1中,在异步处理期间,当我的任何外部服务关闭时,我想将消息放在队列(retryQueue)上,并在其中包含特定的“下一次重试”时间戳。处理来自这个retryQueue的消息的流选择基于“下一个重试”时间的消息,如在“下一个重试”时间超过当前时间,选择要处理的消息。类似于以下链接中提到的内容。Mule中的JMS消息选择器使用日期

Retry JMS queue implementation to deliver failed messages after certain interval of time

能否请您提供的示例代码来实现这一目标?

我想:

<on-redelivery-attempts-exceeded> 
    <message-properties-transformer scope="outbound"> 
<add-message-property key="putOnQueueTime" value="#[function:datestamp:yyyy-MM-dd hh:mm:ssZ]" /> 
    </message-properties-transformer> 
    <jms:outbound-endpoint ref="retryQueue"/> 
</on-redelivery-attempts-exceeded> 

,并在接收流

<jms:inbound-endpoint ref="retryQueue"> 
<!-- I have no idea how to do the selector.... 
I tried....<jms:selector expression="#[header:INBOUND:putOnQueueTime > ((function:now) - 30)]"/>, but obviously it doesn't work. Gives me an invalid message selector. --> 
</jms:inbound-endpoint>. 

另注:如果我设置使用

<add-message-property key="putOnQueueTime" value="#[function:now]"/>, 

它不会结转出站属性作为标题的一部分。这就是为什么我把它改为:

<add-message-property key="putOnQueueTime" value="#[function:datestamp:yyyy-MM-dd hh:mm:ssZ]" /> 
+0

你尝试过什么?分享您的配置和问题,以便我们为您提供帮助。 –

+0

@DavidDossot你需要任何额外的信息吗? – Jeet

回答

1

的表达:

<jms:selector expression="#[header:INBOUND:putOnQueueTime > ((function:now) - 30)]"/> 

应该评估为有效的JMS选择,这是不是这里的情况。试用:

<jms:selector expression="putOnQueueTime > #[XXX]"/> 

将XXX替换为创建所需时间的表达式。

+0

不幸的是,这是我卡住的地方!我需要弄清楚#[XXX],这会给我一些过去的时间......比如......(当前时间 - 30分钟)。 – Jeet

+0

'putOnQueueTime'属性中的值是一个字符串,对不对?您可以在表达式中使用SimpleDateFormat以所需格式格式化任何日期。 –

+0

我正在考虑以毫秒为单位设置时间。我试过但它不起作用。我得到“JMS的WebSphere MQ类为JMS提供程序提供了一个带有无效语法的消息选择器” – Jeet

0

我们试图在我正在进行的项目之一中实现这一目标,并尝试了其他答案中提出的建议,并且它没有工作,并且存在各种差异。问题是jms:selector不支持MEL,因为它依赖于ActiveMQ类。

我们注册了Mulesoft的支持票,他们的回复是这不支持。

我们最终什么事做的是:

  1. 创建一个简单的组件,它做了Thread.sleep(numberOfMillis),其中一个属性被定义米利斯的数量。
  2. 在应该延迟处理的流程中,我们在从入站端点读取消息之后添加了此组件作为第一步。

不是最好的解决办法做过,但它的工作原理..

相关问题