8.9. Delayer
概述
延迟器 是一个处理器,可让您对传入消息应用 相对 时间延迟。
Java DSL 示例
您可以使用 delay () 命令添加 相对 时间延迟(以毫秒为单位)。例如,以下路由会延迟所有传入的信息 2 秒:
from("seda:a").delay(2000).to("mock:result");或者,您可以使用表达式指定时间延迟:
from("seda:a").delay(header("MyDelay")).to("mock:result");
以下 delay () 的 DSL 命令解释为 delay () 的子使用。因此,在某些上下文中,需要通过插入 end () 命令来终止 delay ()的子使用。例如,当 delay () 出现在 onException () 子句中时,您将将其终止,如下所示:
from("direct:start")
.onException(Exception.class)
.maximumRedeliveries(2)
.backOffMultiplier(1.5)
.handled(true)
.delay(1000)
.log("Halting for some time")
.to("mock:halt")
.end()
.end()
.to("mock:result");XML 配置示例
以下示例演示了 XML DSL 中的延迟:
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="seda:a"/>
<delay>
<header>MyDelay</header>
</delay>
<to uri="mock:result"/>
</route>
<route>
<from uri="seda:b"/>
<delay>
<constant>1000</constant>
</delay>
<to uri="mock:result"/>
</route>
</camelContext>创建自定义延迟
您可以使用带有 bean 的表达式和 bean 确定延迟,如下所示:
from("activemq:foo").
delay().expression().method("someBean", "computeDelay").
to("activemq:bar");可以在其中定义 bean 类,如下所示:
public class SomeBean {
public long computeDelay() {
long delay = 0;
// use java code to compute a delay value in millis
return delay;
}
}异步延迟
您可以让延迟者使用 非阻塞异步延迟,这意味着 Apache Camel 计划将来要执行的任务。该任务负责处理路由的后一部分(延迟之后)。这允许调用器线程取消阻塞和服务进一步传入的消息。例如:
from("activemq:queue:foo")
.delay(1000)
.asyncDelayed()
.to("activemq:aDelayedQueue");相同的路由可以使用 XML DSL 编写,如下所示:
<route>
<from uri="activemq:queue:foo"/>
<delay asyncDelayed="true">
<constant>1000</constant>
</delay>
<to uri="activemq:aDealyedQueue"/>
</route>选项
delayer 模式支持以下选项:
| Name | 默认值 | 描述 |
|
|
| Camel 2.4: 如果启用,则将使用已调度的线程池异步发生延迟消息。 |
|
|
Camel 2.4: 如果启用了 | |
|
|
|
Camel 2.4: 如果启用 |