2014-10-03 92 views
2

当使用InOut范例向JMS端点发送请求/响应消息时,Camel JMS documentation描述了如何在请求消息上设置消息过期,但它没有描述响应消息是否具有当请求消息的使用者发送它时设置超时(JMS过期)。该文档确实描述了消费者可以设置的replyToDeliveryPersistent URI选项,以指定它发送的响应消息应该是非持久性的,但我没有看到任何让您指定响应消息是否会设置过期日期的内容。TimeToLive在骆驼响应消息中

是否有某种方法可以确保响应消息将会过期(因此可以自动从代理中删除),如果它们在一段时间内未消耗(例如,因为请求的生成者在读取之前被杀死对最终请求的响应),而不实现自定义的ActiveMQ使用者,并失去使用Camel的好处?我控制着生产者和消费者,所以这些变化可以发生在他们需要做出的任何一方(我知道消费者的终点是这个可能需要完成的地方)。这里唯一的标准是骆驼必须保持处理消息和回复消息的响应方法,因为必须亲自实施这个方法比持久回复消息更糟糕。

回答

3

对消息设置到期时间(JMSExpiration标头)的唯一方法是从其生产点(即生产者)开始。

在你的情况下,消费者您的要求应设置JMSExpiration日期明确,使用JMS组件的URI选项timeToLive,有没有办法来设置在请求方此选项。


1) JMS规范指出,而不是直接设置JMSExpiration,JMS客户端应指定时间到现场。然后将标题计算为生存时间与当前GMT值之和。

+0

你说得对,URI选项是'replyToDeliveryPersistent';我已经更新了这个问题来解决这个问题。我知道我需要将这一点应用于消费者方面,而且这不是问题,因为我控制了这两者; “replyToDeliveryPersistent”URI选项也适用于消费者的URI,所以我期望将它设置在那里。我实际上解释了为回应作者然后删除的另一个答案,所以我已经更新了我的问题以明确说明。 – Tim 2014-10-09 16:09:11

+0

所以我认为你所建议的是应用'JMSExpiration'头(实际上可以直接发送,参见http://stackoverflow.com/questions/15507948/set-ttl-apache-camel-java-dsl )通过Camel处理器或直接在Camel DSL中发送给响应消息。这比我更喜欢的更麻烦(我可能会提交一个用于骆驼的JIRA来添加一个'replyToTimeToLive' URI选项以使它更容易),但它会起作用。 – Tim 2014-10-09 16:24:56

+0

@Tim我很抱歉,但我现在很困惑。让我给**客户端应用程序**和另一端**服务器应用程序**调用进/出端。 *客户端应用*将发送请求消息并等待回复,*服务器应用*将接收*客户端应用*发送的请求消息,对其进行处理,生成回复消息并将其发送到*客户端应用* (正在等待它)。现在,你想要的是*客户端应用程序*指定将由*服务器应用程序*生成并发送的回复消息的JMSExpiration,我是否正确地获得了该消息? – 2014-10-09 21:05:01