173.5. 预定义的表达式


从 Camel 版本 2.13.0 开始,JGroups 组件附带名为 JGroupsExpressions 的预定义表达式工厂。

如果您要创建仅在 Camel 上下文尚未启动时影响路由的延迟程序,请使用 JGroupsExpressions.delayIfContextNotStarted (长延迟) 工厂方法。只有 Camel 上下文处于不同于 启动 的状态时,此工厂方法创建的表达式才会返回给定延迟值。如果您希望使用 JGroups 组件在集群中保持单例(master)路由,则此表达式特别有用。如果 Camel 上下文尚未启动,则 控制总线 启动命令不会初始化单例路由。因此,您需要延迟 master 路由的启动,以确保在 Camel 上下文启动后已初始化它。由于这种情况只在初始化集群期间发生,所以我们不希望延迟从节点的启动成为新主设备 - 为什么我们需要一个条件延迟表达式。

以下代码片段演示了如何将条件延迟与 JGroups 组件一起使用,以延迟集群中 master 节点的初始启动。

import static java.util.concurrent.TimeUnit.SECONDS;
import static org.apache.camel.component.jgroups.JGroupsExpressions.delayIfContextNotStarted;
import static org.apache.camel.component.jgroups.JGroupsFilters.dropNonCoordinatorViews;
...
from("jgroups:clusterName?enableViewMessages=true").
  filter(dropNonCoordinatorViews()).
  threads().delay(delayIfContextNotStarted(SECONDS.toMillis(5))). // run in separated and delayed thread. Delay only if the context hasn't been started already.
  to("controlbus:route?routeId=masterRoute&action=start&async=true");

from("timer://master?repeatCount=1").routeId("masterRoute").autoStartup(false).to(masterMockUri); 
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.