Apache camel 骆驼卧姿

Apache camel 骆驼卧姿,apache-camel,eip,Apache Camel,Eip,我正在研究Camel中的一种机制,该机制将为来自标志的消息选择一个端点,该标志可以是true或false。这是一种节流机制,在我的上游通道被淹没的情况下,它会将消息重新路由到大容量摄取端点(发送到HDFS) 最终,我的路线如下所示: from("queue:myqueue").bean("messageParser") .dynamicRoute(bean(ThrottleHelper.class, 'buildEndpoint')); from('direct:regular').t

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

最终,我的路线如下所示:

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

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

from('direct:throttle').to('hdfs');
public static String buildEndpoint() {
   synchronized(shouldThrottle) {
      if(shouldThrottle)
         return "direct:throttle";
      else
         return "direct:regular"
    }
} 
我的ThrottleHelper类的buildEndpoint方法如下所示:

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

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

from('direct:throttle').to('hdfs');
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"
    }
} 

谢谢

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

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


如果您只想使用表达式或bean方法选择一个端点,那么最好使用动态收件人列表(cfr)。如果在route builder中使用
.recipientList()
而不是
.dynamicRoute()
,则第一个
buildEndpoint
方法实现将正常工作。

。我通过单元测试验证了这种行为。我列出的第二个方法(测试该方法是否已被调用)有效。我的下一个问题——为什么我要使用dynamicRouter,而不是让我的ThrottleHelper使用“shouldThrottle”属性来丰富每条消息的标题,并使用基于该标题属性的内容路由?这里的想法是试图避免在我的消息上存储额外的属性。它还避免了必须通过过滤器/选项进行迭代,以确定消息应该遍历哪个端点。然而,这似乎比它的价值要麻烦得多,特别是如果我仍然需要在消息上存储状态的话。我最好在这里使用choice()构造。这很公平,但我认为您基于内容的路由思想实际上是解决这种情况的最佳方法。使用addition属性丰富消息是一个非常轻量级的选项,它的设计基本上是为了帮助简化您的确切用例。不妨利用手头的工具更好地满足您的需求。同意。谢谢你的回复!