我指的是Camel关于JGroups的文档中的“在群集中保持单一路径”这一章。
我按照前面章节中描述的方式在群集中成功实现了单一路径。但是现在我需要在多个独立的(例如在不同的WAR中)路由中提供相同的功能。
第一个路径构建器配置
但是第二个路由构建器尝试配置通过controlbus组件启动第二个实际路由的路由失败,因为已经有一个消费者正在侦听JGroups端点,并且该端点没有实现MultipleConsumersSupport。
启动多个路由的正确方法是什么,每个路由都在单独的路由构建器中配置,这些路由构建器本身可能位于不同的WAR中,作为单例?
答案 0 :(得分:0)
我仍然无法判断这是否是启动多条路线的“正确方法”,但至少我发现了一种有效的方法。
摘要:按照http://camel.apache.org/recipient-list.html
中的说明应用邮件路由模式“收件人列表”更详细一点:我主要不得不替换此启动路由定义(仅在活动节点上使用ID routeId
启动路由)
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);
并且每个路线(同样具有ID routeId
)将被启动
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; }
}
欢迎提出改进意见和建议!