175.7. 预定义的表达式


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

如果您要创建仅影响 Camel 上下文时路由的延迟器,请使用 JGroupsExpressions.delayIfContextNotStarted (long delay) factory 方法。此工厂方法创建的表达式只有在 Camel 上下文处于与启动 状态不同时,才会返回给定延迟值。如果您要使用 JGroups 组件在集群中保留单例(master)路由时,此表达式特别有用。如果 Camel 上下文尚未启动,则 控制 Bus start 命令不会初始化单例路由。因此,您需要延迟 master 路由的启动,以确保它在 Camel 上下文启动后初始化。由于这样的场景只能在集群初始化期间发生,因此我们不希望延迟从节点启动成为新的主节点 - 这为什么我们需要有条件延迟表达式。

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

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.