这是用户在 2024-3-28 22:06 为 https://camel.apache.org/manual/configuring-route-startup-ordering-and-autostartup.html 保存的双语快照页面,由 沉浸式翻译 提供双语支持。了解如何保存?


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


骆驼支持配置两个方面:

  •  自动启动


  • 开始路线的顺序

 自动启动


{{0}}选项允许我们在 Camel 启动时不自动启动路由。


自动启动可以在两个级别上进行配置

  •  CamelContext - 全局


  • 路线 - 每条路线单独设置


例如,下面的 CamelContext 中,我们已经配置{{0}}以防止 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>


那么你如何开始路线呢?


在{{1}}上,{{0}}选项只使用一次,所以您可以通过在 Java 中调用其{{2}}方法来手动启动 Camel,如下所示。


例如,在使用 Spring 时,您可以通过 Spring {{1}}获取{{0}}

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

// now start all the routes
camel.getRouteController().startAllRoutes();

路由也可以通过 JMX 启动(需要将{{0}} JAR 放在类路径上),通过在 CamelContext MBean 上调用{{1}}操作来实现。


自动启动每个路由级别


您还可以使用{{0}}选项来配置在 Camel 启动时是否启动给定的路由。默认情况下,路由是自动启动的。


在 XML DSL 中,您可以按照以下方式禁用自动启动

<route autoStartup="false">
   <from uri="activemq:queue:special"/>
   <to uri="file://backup"/>
</route>


并明确说明应该开始:

<route autoStartup="true">
   <from uri="activemq:queue:special"/>
   <to uri="file://backup"/>
</route>


在 Java DSL 中,您可以按照以下方式配置{{0}}的自动启动

camelContext.setAutoStartup(false);


在路由级别上,您可以通过{{0}}禁用它

from("activemq:queue:special").noAutoStartup()
    .to("file://backup");


根据布尔值、字符串或属性进行启动,请执行以下操作之一:

// 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 以非确定性的顺序启动路由。现在,您可以精细控制路由的启动顺序。有一个新的属性{{0}},它是一个{{1}},表示顺序。Camel 在启动之前对路由进行排序。具有最低{{2}}的路由首先启动,具有最高{{2}}的路由最后启动。


在您的 CamelContext 中,所有定义的{{0}}必须在所有路由中是唯一的。否则,如果在路由中存在{{1}}号码冲突,路由将无法启动,抛出{{2}}。


通常情况下,您还应该使用小于 1000 的数字,因为没有明确定义的路由将自动分配从 1000 开始的数字。因此,将 1000 及以上的视图编号视为 Camel 内部保留。


然而,您也可以使用比 1000 更高的数字(以避免与自动分配的数字发生冲突)来指定最后启动的路由。通常,从 10000 开始使用数字应该是安全的。


在{{0}}方面,没有严格的规定它必须从 1 开始,且递增 1。例如,你可以使用 100、200、205、89。唯一的经验法则是数字必须是唯一的。


你为什么想要控制起跑顺序?


它可以在路由相互依赖的情况下提供帮助,并且在关闭 Camel 时也可以帮助实现优雅的关闭,因为 Camel 可以按正确的顺序停止路由。


骆驼将按照相反的顺序停止路线。


让我们来试试几个例子。


启动顺序示例

from("seda:foo").startupOrder(1)
    .to("mock:result");

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


同样的例子使用 XML DSL:

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

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


在这个例子中,我们有两个路由,我们已经开始了,即直接:start 路由应该在 seda:foo 路由之后启动。因为直接:start 被认为是输入,我们希望 seda:foo 路由先启动并运行。


使用 STARTORDER 与非 STARTORDER 一起使用


您还可以混合使用已定义和未定义{{0}}的路由。下面的前两个路由有定义的起始顺序,而最后一个路由没有定义。

from("seda:foo").startupOrder(1)
    .to("mock:result");

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

from("direct:bar")
    .to("seda:bar");


同样的例子使用 XML DSL:

<routes>
    <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>
</routes>


在上述路由中,我们没有在最后一个路由 direct:bar 中定义一个{{0}},Camel 将自动为其分配一个数字,这种情况下将为 1000;因此,该路由将最后启动。


所以你可以利用这一点,只在真正需要的路线上分配一个{{0}}。


配置路由以最后启动


您可以在{{0}}中使用一个较高的数字,使特定路由最后启动,如下所示:

// 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");


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

  1. seda:foo

  2.  直接:开始

  3.  色达:酒吧

  4.  直接:酒吧

 关闭路由


骆驼将按照它们启动的相反顺序关闭路由。


请参阅优雅关机。