配置路由启动顺序和自动启动
骆驼支持配置两个方面:
-
自动启动
-
开始路线的顺序
自动启动
{{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");
在上面的示例中,路由的启动顺序应为:
-
seda:foo
-
直接:开始
-
色达:酒吧
-
直接:酒吧