我指的是 Camel 关于 JGroups 的文档中的"在集群内保持单例路由"一章。
我按照前面提到的章节中描述的方式在集群中成功实现了单例路由。但是现在我需要在多个独立的(例如在不同的 WAR(路由中提供相同的功能。
第一个路由生成器配置
- 第一条实际路线和
- 通过控制总线组件启动实际路由的路由(如果该路由位于实时服务器上(。
但是,尝试配置通过控制总线组件启动第二个实际路由的路由的第二个路由生成器失败,因为已经有一个使用者侦听 JGroups 端点,并且该端点未实现 MultipleConsumerSupport。
启动多条路由的正确方法是什么,每个路由都配置在单独的路由构建器中,这些路由生成器本身可能作为单例驻留在不同的 WAR 中?
我仍然无法判断这是否是开始多条路线的"正确方法",但至少我找到了一种有效的方法。
摘要:应用邮件路由模式"收件人列表",如 http://camel.apache.org/recipient-list.html 中所述
更详细一点:我主要不得不替换这个起始路由定义(仅在活动节点上具有 IDrouteId
的起始路由(
from("jgroups:clusterName?enableViewMessages=true")
.filter(JGroupsFilters.dropNonCoordinatorViews())
.threads().delay(JGroupsExpressions.delayIfContextNotStarted(TimeUnit.SECONDS.toMillis(5)))
.to("controlbus:route?routeId=" + routeId + "&action=start&async=true");
使用此起始路由定义
from("jgroups:clusterName?enableViewMessages=true")
.filter(JGroupsFilters.dropNonCoordinatorViews())
.threads().delay(JGroupsExpressions.delayIfContextNotStarted(TimeUnit.SECONDS.toMillis(5)))
.bean(dynamicRecipientList);
以及要启动的每条路由(再次使用 IDrouteId
dynamicRecipientList.get().add("direct:" + routeId);
from("direct:" + routeId)
.to("controlbus:route?routeId=" + routeId + "&action=start&async=true");
其中 dynamicRecipientList 可能是类似内容的实例
public class DynamicRecipientList {
private List<String> recipients = new ArrayList<>();
public List<String> get() { return recipients; }
@RecipientList public List<String> get(String body) { return recipients; }
}
仍然欢迎提出改进意见和建议!