当前位置: 首页 > 网络应用技术

解决骆驼多播成分聚合策略的问题的过程

时间:2023-03-08 18:06:34 网络应用技术

  摘要:本文找到了与案例相关的骆驼多播组件聚合策略。通过查看骆驼源代码,找到问题并提供了解决方案的原因。我希望本文可以帮助遇到同样问题的骆驼用户。

  本文是从华为加拿大雷吉·马修斯研究所翻译的,该研究所发表在“遇到Apache Camel社区的副武器后的路由多播输出”上。在获得原始作者的同意后,本文对某些内容进行了一些修改,使其对某些内容进行了修改。原始文字。

  多播是Apache骆驼(以下称为“骆驼”)中强大的EIP组件,它可以将消息发送到多个子胸部,然后并行执行。

  请参阅官方网站文档,我们可以通过两种方式配置多播组件:

  本文的情况如下:使用码头组件发布API。调用API后,该消息将发送到“直接:A”和“ Direct:b”。使用自定义聚合策略后,继续执行以下步骤。模拟失败;“直接:b”正常运行。同时,在Onexception中定义了异常的处理策略。

  本文中使用的骆驼版本为3.8.0

  定制聚合物SimpleFlowMergeggregator如下。其中,我们将所有子曲线的结果都放在列表对象中。

  基于对多播组件的实现逻辑的理解,当我们认为有多个子扣时,操作的结果应为:如果一个子路径之一可以成功运行,则聚合的结果将继续执行以下步骤;如果所有运行故障的所有提交失败,它都会失败整个路线。在这种情况下,由于子path“ direct:a”,该操作是异常的,子cate“ direct:b”正常运行,然后是两个步骤logs(日志)和变换应正常执行。

  运行上述情况,日志信息如下:

  2021-05-06 12:43:18.565信息13956 --- [QTP916897446-42] ROUTE1:接收请求2021-05-06 12:43:18.566信息13956---12:43:18.575信息13956 --- [#4-MULTICAST] ROUTE2:执行Path_1-Exception Path 2021-05-06 12:43:18.575 INFO 13956 ----------------- [#4-MULTICAST] ROUTE2:ROUTE 2:StartingException throw 2021--------.m.d.d.d.d.m.d.m.d.m.d.m.d.m.d.m.d.m.d.m.d.m.d.m.d.m.msimpleflowmergeggeggregator:Inside gentregator {“ data”:“ err”} 2021-05-06 12:43:43:43:19.575信息13955信息13956-43:43:43:43:43:43:43:43:4:21.576信息13956 ---- [#3-MULTICAST] ROUTE3:PATH_2 2021-05-06 12:43:43:21.576信息13956 --- [#3--- [#3--]Multicast] c.e.d.m.mplegggegegegator3

  在观察上述日志时,我们发现在两个子路径结果的聚集后,未执行两个随后的步骤日志(日志)和变换。这不符合我们期望的结果。

  经过多次测试,我们还发现,只有在达到聚合物SimpleFlowMergeggregator的第一个皮下路径(“直接:A”)时,未执行后续步骤。如果第一人称是第一人称,第一人称执行路径(“直接:a”)是成功的,即使执行失败了另一个子path(“ direct:b”),也是如此步骤将继续。

  接下来,我们通过检查骆驼源代码来找出上述现象的原因。

  在骆驼核过程模块的pipeline.java中,其Run()方法中都有这样的代码:

  其中,如果判断确定是否继续执行以下步骤:

  可以看出,在以下三种情况下,将不会执行后续步骤:

  1.先前的步骤已将交换对象标记为状态。

  2.没有执行以下步骤。

  3. continueprocessing()方法返回false。

  让我们看一下ContinueProcessing()方法的代码。

  可以看出,当执行过程异常并被异常处理器捕获时,ContinueProcessing()方法将返回false。

  回到我们的案例,第一个到达聚合物SimpleFlowMergeggregator的皮下路径(“ Direct:A”),它将用作后续聚集的基础。其他子符号(“直接:b”)将添加其各自的身体数据。sub -path“直接:a”将设置为状态识别,该状态标识将传递给下游,以确定是否继续以下步骤。“作为“ Direct:A”路径,连续性将返回为False,并且将不会执行后续步骤。

  对于上述问题,用户可以使用各种方法在异常处理时设置Exchange对象的状态。本文使用以下解决方案:如果正常执行第一个儿童路径,则继续进行以下步骤;如果第一个儿童路径被执行异常,它将与其他成功的子任命者交换,然后继续以下步骤。

  更新的自定义聚合物SimpleFlowMergeggregator如下:如下:

  再次运行上述情况,日志信息如下:

  2021-05-06 12:46:19.122信息2576 --- [QTP174245837-45] Route1:Route1:收到请求2021-05-06 12:46:19.123信息2576 ------------------05-06 12:46:19.130信息2576 --- [#3-MULTICAST] ROUTE2:执行Path_1-Exception Path 2021-05-06 12:46:19.130 INFO 2576 ------------------ [#3-MULTICAST] ROUTE2:startingException 2:投掷2021-05-06 12:46:19.134信息2576 --- [#3-MULTICAST] ROUTE2:例外处理程序调用2021-05-06 12:46:19.135 INFO 2576 --------------------------------- [#3-Multicast]:内部聚合器{“ data”:“ err”} 2021-05-06 12:46:20.130信息2576 --- [#4-MULTICAST] ROUTE3:执行Path_2-Success Path 2021-06 12:46:46:46:46:46:46:46:46:46:46:46:46:46。:22.132信息2576 --- [#4 -Multicast] C.E.D.M.Simplowmergeagggegeggegater:成功找到了新的交换。信息2576 --- [#4 -MULTICAST] ROUTE1:另一log

  可以看出,使用新的自定义聚合策略后,成功执行了后续的日志和转换步骤。

  通过案例,通过案例找到了骆驼多播组件聚合策略。通过查看骆驼源代码,发现问题并提供了解决方案的原因。

  我希望本文可以帮助遇到同样问题的骆驼用户。

  本文分享了真诚的Yunyun社区,作者:中间兄弟。