25.15. 关于生存时间
先阅读有关同步时钟的信息。
当您通过 Camel 与 JMS 进行请求/恢复(InOut)时,Camel 在发送方一侧使用超时,这是来自 requestTimeout
选项中的 20 秒。您可以通过设置 higher/lower 值来控制这个值。但是,到实时值的时间仍然会在要发送的消息上设置。这需要时钟在系统间同步。如果没有,则可能要禁用要设置实时值的时间。现在,可以使用 Camel 2.8 中的 disableTimeToLive
选项实现。因此,如果您将此选项设置为 disableTimeToLive=true
,则 Camel 在发送 JMS 消息时不会将任何时间设置为 live 值。但 请求超时仍然活跃。例如,如果您对 JMS 进行请求/回复超过 JMS 且已禁用时间,那么 Camel 仍将使用超时为 20 秒( requestTimeout
选项)。也可以配置该选项。因此,两个选项 requestTimeout
和 disableTimeToLive
可让您精细地控制请求/回复。
您可以在消息中提供标头来覆盖并使用作为请求超时值,而不是端点配置的值。例如:
from("direct:someWhere") .to("jms:queue:foo?replyTo=bar&requestTimeout=30s") .to("bean:processReply");
在上面的路由中,我们有一个端点配置的 requestTimeout
为 30 秒。因此,Camel 将等待 30 秒时间,该回复消息在栏队列中返回。如果未收到回复消息,那么在 Exchange 上设置了 org.apache.camel.ExchangeTimedOutException
,则 Camel 会继续路由消息,然后因为异常而失败,Camel 的错误处理程序会响应。
如果要使用每个消息超时值,您可以使用键 org.apache.camel.component.jms.JmsConstants#JMS_REQUEST_TIMEOUT
,它具有恒定值 "CamelJmsRequestTimeout"
,其超时值为长类型。
例如,可以使用 bean 计算每个消息的超时值,例如在服务 bean 上调用 "whatIsTheTimeout"
方法,如下所示:
from("direct:someWhere") .setHeader("CamelJmsRequestTimeout", method(ServiceBean.class, "whatIsTheTimeout")) .to("jms:queue:foo?replyTo=bar&requestTimeout=30s") .to("bean:processReply");
当您用 Camel 相对 JMS 触发和忘记(InOut)时,Camel 默认 不会在 消息上将任何时间设置为实时值。您可以使用 timeToLive
选项配置值。例如,要指示 5 sec。设置 timeToLive=5000
。可以使用 option disableTimeToLive
选项,强制禁用时间为 live,也用于 InOnly messaging。requestTimeout
选项不用于 InOnly 消息传递。