0

在 Mule 3.3.1 中,在异步处理期间,当我的任何外部服务关闭时,我想将消息放在retryQueue具有特定“下一次重试”时间戳的队列 () 上。从中处理消息的流retryQueue根据“下一次重试”时间选择消息,如果“下一次重试”时间超过当前时间,则选择要处理的消息。类似于以下链接中提到的内容。

在一定的时间间隔后重试 JMS 队列实现以传递失败的消息

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

我试过了:

<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]" />
4

2 回答 2

1

中的表达式:

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

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

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

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

于 2013-08-28T15:45:32.833 回答
0

我们试图在我正在从事的一个项目中实现这一点,并尝试了此处另一个答案中的建议,但它没有工作,有各种变体。问题是 jms:selector 不支持 MEL,因为它依赖于 ActiveMQ 类。

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

我们最终做的是这样的:

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

不是有史以来最好的解决方案,但它有效..

于 2014-03-27T11:46:56.157 回答