操作指南

配置路由启动顺序和自动启动

师成师成· 更新于 2026-09-28· 阅读 17 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

配置路由启动顺序与自动启动

Camel 支持配置两个方面:

  • 自动启动
  • 路由的启动顺序

自动启动

autoStartup 选项允许我们配置 Camel 在启动时不自动启动路由。

自动启动可以在两个层级上配置:

  • Camel 上下文:全局
  • 路由:按各条路由单独配置

例如,下面的 CamelContext 中配置了 autoStartup=false,以防止 Camel 在启动时启动所有路由。

<camelContext id="myCamel" xmlns="http://camel.apache.org/schema/spring"
              autoStartup="false">
    <route>
        <from uri="direct:foo"/>
        <to uri="mock:foo"/>
    </route>
    <route>
        <from uri="direct:bar"/>
        <to uri="mock:bar"/>
    </route>
</camelContext>

那么你该如何启动这些路由呢?

<camelContext> 上的 autoStartup 选项只会生效一次,因此之后你可以在 Java 中调用 Camel 的 start 方法来手动启动 Camel,如下所示。

例如,在使用 Spring 时,你可以通过 Spring 的 ApplicationContext 获取 CamelContext:

ApplicationContext ac = ...
CamelContext camel = ac.getBean("myCamel", CamelContext.class);

// now start all the routes
camel.getRouteController().startAllRoutes();
也可以通过 JMX 启动路由(需要将 camel-management JAR 放在 classpath 中),方法是对 CamelContext MBean 调用 startAllRoutes 操作。

按路由级别自动启动

你还可以使用 autoStartup 选项来配置当 Camel 启动时是否启动给定的路由。默认情况下,路由会自动启动。

在 XML DSL 中,你可以按如下方式禁用自动启动:

  • Java
  • XML
  • YAML
from("activemq:queue:special").autoStartup(false)
  .to("file://backup");
<route autoStartup="false">
   <from uri="activemq:queue:special"/>
   <to uri="file://backup"/>
</route>
- route:
    autoStartup: "false"
    from:
      uri: activemq:queue:special
      steps:
        - to:
            uri: file://backup

要显式声明该路由应当启动:

  • Java
  • XML
  • YAML
from("activemq:queue:special").autoStartup(true)
  .to("file://backup");
<route autoStartup="true">
   <from uri="activemq:queue:special"/>
   <to uri="file://backup"/>
</route>
- route:
    autoStartup: "true"
    from:
      uri: activemq:queue:special
      steps:
        - to:
            uri: file://backup

在 Java DSL 中,你可以按如下方式在 CamelContext 上配置自动启动:

camelContext.setAutoStartup(false);

或者在 application.properties 中:

camel.main.auto-startup = false

要基于布尔值、字符串或属性来启动,请执行以下任一操作:

仅限 Java:autoStartup 的布尔值、字符串和属性占位符变体

// using a boolean
from("activemq:queue:special").autoStartup(false)
    .to("file://backup");

// using a string
from("activemq:queue:special").autoStartup("false")
    .to("file://backup");

// using property placeholders
from("activemq:queue:special").autoStartup("{{startupRouteProperty}}")
    .to("file://backup");

配置路由的启动顺序

你还可以配置路由的启动顺序。以前,Camel 以不确定的顺序启动路由。现在你可以精细地控制路由的启动顺序。新增了一个 startupOrder 属性,它是一个 Integer,用于声明启动顺序。Camel 会在启动前对路由进行排序。startupOrder 值最小的路由最先启动,值最大的最后启动。

所有定义的 startupOrder 在你的 CamelContext 中的所有路由之间必须是唯一的。否则,如果路由之间的 startupOrder 数值出现冲突,路由将启动失败并抛出 org.apache.camel.FailedToStartRouteException。

通常你应当使用小于 1000 的数字,因为没有显式定义 startupOrder 的路由会自动分配一个从 1000 开始递增的数字。因此,请将 1000 及以上的数字视为 Camel 内部保留使用。

不过,你也可以使用大于 1000 的数字(以避免与这些自动分配的数字冲突)来指定最后启动的路由。通常,从 10000 开始的数字对于这一用途是安全的。

关于 startupOrder,并没有必须从 1 开始并以 1 递增的严格规则。例如,你可以使用:100、200、205、89,只要你愿意。唯一的经验法则是数字必须唯一。

为什么要控制启动顺序?

当路由之间相互依赖时,这会有所帮助;同时也有助于 Camel 的优雅关闭,因为 Camel 也能按照正确的顺序停止路由。

Apache Camel 会按照路由启动时的相反顺序停止它们。

我们来看几个例子。

启动顺序示例

  • Java
  • XML
  • YAML
from("seda:foo").startupOrder(1)
    .to("mock:result");

from("direct:start").startupOrder(2)
    .to("seda:foo");
<route startupOrder="1">
    <from uri="seda:foo"/>
    <to uri="mock:result"/>
</route>

<route startupOrder="2">
    <from uri="direct:start"/>
    <to uri="seda:foo"/>
</route>
- route:
    startupOrder: 1
    from:
      uri: seda:foo
      steps:
        - to:
            uri: mock:result
- route:
    startupOrder: 2
    from:
      uri: direct:start
      steps:
        - to:
            uri: seda:foo

在本例中,我们有两条路由,并设定 direct:start 路由必须在 seda:foo 路由之后启动。因为 direct:start 被视为输入端,我们希望 seda:foo 路由先启动并运行。

将 startOrder 与未设置 startOrder 的路由配合使用

你也可以混合使用定义了 startupOrder 和未定义 startupOrder 的路由。下面前两条路由定义了启动顺序,最后一条则没有。

  • Java
  • XML
  • YAML
from("seda:foo").startupOrder(1)
    .to("mock:result");

from("direct:start").startupOrder(2)
    .to("seda:foo");

from("direct:bar")
    .to("seda:bar");
<route startupOrder="1">
    <from uri="seda:foo"/>
    <to uri="mock:result"/>
</route>

<route startupOrder="2">
    <from uri="direct:start"/>
    <to uri="seda:foo"/>
</route>

<route>
    <from uri="direct:bar"/>
    <to uri="seda:bar"/>
</route>
- route:
    startupOrder: 1
    from:
      uri: seda:foo
      steps:
        - to:
            uri: mock:result
- route:
    startupOrder: 2
    from:
      uri: direct:start
      steps:
        - to:
            uri: seda:foo
- route:
    from:
      uri: direct:bar
      steps:
        - to:
            uri: seda:bar

在上面的路由中,我们没有为最后一条路由 direct:bar 定义 startupOrder,Camel 会自动为它分配一个编号,在本例中为 1000。因此,该路由将最后启动。

所以你可以利用这一点,只为真正需要的路由指定 startupOrder。

配置路由最后启动

你可以在 startupOrder 中使用一个较大的数字,使特定路由最后启动,如下所示:

  • Java
  • XML
  • YAML
// use auto assigned startup ordering
from("direct:start").to("seda:foo");

// should start first
from("seda:foo").startupOrder(1).to("mock:result");

// should start last after the default routes
from("direct:bar").startupOrder(12345).to("seda:bar");

// use auto assigned startup ordering
from("seda:bar").to("mock:other");
    <route>
        <from uri="direct:start"/>
        <to uri="seda:foo"/>
    </route>

    <route startupOrder="1">
        <from uri="seda:foo"/>
        <to uri="mock:result"/>
    </route>

    <route startupOrder="12345">
        <from uri="direct:bar"/>
        <to uri="seda:bar"/>
    </route>

    <route>
        <from uri="seda:bar"/>
        <to uri="mock:other"/>
    </route>
- route:
    from:
      uri: direct:start
      steps:
        - to:
            uri: seda:foo
- route:
    startupOrder: 1
    from:
      uri: seda:foo
      steps:
        - to:
            uri: mock:result
- route:
    startupOrder: 12345
    from:
      uri: direct:bar
      steps:
        - to:
            uri: seda:bar
- route:
    from:
      uri: seda:bar
      steps:
        - to:
            uri: mock:other

在上面的示例中,路由的启动顺序应为:

  1. seda:foo
  2. direct:start
  3. seda:bar
  4. direct:bar

关闭路由

Apache Camel 会按照启动时相反的顺序关闭路由。

更多信息请参阅 优雅关闭。

评论

登录后参与评论

正在加载评论…