群集

时间:2017-08-25 15:57:30

标签: java apache-camel cluster-computing jgroups

我指的是Camel关于JGroups的文档中的“在群集中保持单一路径”这一章。

我按照前面章节中描述的方式在群集中成功实现了单一路径。但是现在我需要在多个独立的(例如在不同的WAR中)路由中提供相同的功能。

第一个路径构建器配置

  • 第一条实际路线
  • 如果它位于实时服务器上,则通过controlbus组件启动实际路由的路由。

但是第二个路由构建器尝试配置通过controlbus组件启动第二个实际路由的路由失败,因为已经有一个消费者正在侦听JGroups端点,并且该端点没有实现MultipleConsumersSupport。

启动多个路由的正确方法是什么,每个路由都在单独的路由构建器中配置,这些路由构建器本身可能位于不同的WAR中,作为单例?

1 个答案:

答案 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; }
}

欢迎提出改进意见和建议!