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 结合使用来确定延迟,如下所示:

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

默认值

描述

asyncDelayed

false

Camel 2.4: 如果启用,则使用调度的线程池异步发生延迟消息。

executorServiceRef

 

Camel 2.4: 如果启用了 asyncDelay,则引用使用自定义线程池。

callerRunsWhenRejected

true

Camel 2.4: 如果启用了 asyncDelayed,则使用它。这控制调用者线程是否应该在线程池拒绝任务时执行任务。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.