8.9. Delayer
概述
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()
的子clauses。因此,在某些上下文中,需要通过插入 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 合并来确定延迟,如下所示:
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 模式支持以下选项:
名称 | 默认值 | 描述 |
|
| Camel 2.4: 如果启用,则使用调度的线程池以异步方式进行延迟。 |
|
Camel 2.4: 如果已启用 | |
|
|
Camel 2.4: 如果启用了 |