配置路由启动顺序和自动启动
配置路由启动顺序与自动启动
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在上面的示例中,路由的启动顺序应为:
seda:foodirect:startseda:bardirect:bar
关闭路由
Apache Camel 会按照启动时相反的顺序关闭路由。
更多信息请参阅 优雅关闭。
评论
登录后参与评论
KnowForge