【问题标题】:DynamicRouting in CamelCamel中的动态路由
【发布时间】:2014-03-27 13:03:00
【问题描述】:

我正在研究 Camel 中的一种机制,该机制将从可以为真或假的标志中选择消息的端点。这是一种节流机制,在我的上游通道被淹没的情况下,它会将消息重新路由到批量摄取端点(发送到 HDFS)。

最终,我的路线是这样的:

from("queue:myqueue").bean("messageParser")
    .dynamicRoute(bean(ThrottleHelper.class, 'buildEndpoint'));

from('direct:regular').to('hbase');

from('direct:throttle').to('hdfs');

我的 ThrottleHelper 类的 buildEndpoint 方法如下所示:

public static String buildEndpoint() {
   synchronized(shouldThrottle) {
      if(shouldThrottle)
         return "direct:throttle";
      else
         return "direct:regular"
    }
} 

目前,我在类上有一个名为 checkStatus(); 的方法;设置 shouldThrottle (静态变量)。 checkStatus() 每分钟在 Camel 石英计时器上运行一次。

我注意到一些奇怪的行为,我想我可能误用了这种模式。通过对 Camel 模式实现的进一步搜索,看起来 buildEndpoint() 将在返回的每个端点被消息遍历后被调用。这是真的?或者我可以期望路径在进入“direct:throttle”或“direct:regular”后终止?

根据我在网络上收集到的信息,我的方法真的应该像这样吗?

public static String buildEndpoint(Message message) {
   if(message.getHeader('throttled') != null)
      return null;
   else
      message.setHeader('throttled', true);

   synchronized(shouldThrottle) {
      if(shouldThrottle)
         return "direct:throttle";
      else
         return "direct:regular"
    }
} 

谢谢!

【问题讨论】:

  • 没关系。我通过单元测试验证了这种行为。我列出的第二种方法(测试是否已调用该方法)有效。我的下一个问题 - 为什么我要使用 dynamicRouter 而不是让我的 ThrottleHelper 使用“shouldThrottle”属性丰富每条消息的标头并使用基于该标头属性的基于内容的路由?

标签: apache-camel eip


【解决方案1】:

official documentation 看来,是的,您的第二个构造更接近正确用法。基本上,动态路由器可用于通过多个端点路由消息,而不仅仅是立即终止的单个端点。要告诉动态路由器停止将您的消息路由到另一个端点,您的 bean 必须返回 null,正如您在最终代码 sn-p 中所写的那样,以指示此消息的路由已完成。

【讨论】:

  • 这里的想法是避免在我的消息上存储额外的属性。这也是为了避免必须遍历过滤器/选择来确定消息应该遍历哪个端点。然而,它似乎确实比它的价值更麻烦,特别是如果我仍然需要在消息上存储状态。我最好在这里使用choice() 构造。
  • 很公平,但我认为您的基于内容的路由想法实际上是这种情况下的最佳方法。使用附加属性丰富您的消息是一个非常轻量级的选项,它基本上旨在帮助促进您的确切用例。不妨利用手头更适合您需求的工具。
  • 同意。感谢您的回复!
【解决方案2】:

正如 ProgrammerDan 所指出的,动态路由器用于通过多个端点路由消息,因此需要显式返回 null 以指示路由结束。

如果您只想使用表达式或 bean 方法选择单个端点,则最好使用动态收件人列表 (cfr.http://camel.apache.org/recipient-list.html)。如果您在路由构建器中使用.recipientList() 而不是.dynamicRoute(),那么您的第一个buildEndpoint 方法实现就可以正常工作。

【讨论】:

    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2016-03-22
    • 1970-01-01
    相关资源
    最近更新 更多