如何在有条件的 apache camel 中添加后处理拦截器?
Posted
技术标签:
【中文标题】如何在有条件的 apache camel 中添加后处理拦截器?【英文标题】:How to add postprocess interceptor in apache camel with condition? 【发布时间】:2021-11-27 19:23:54 【问题描述】:我有 4 天使用 apache camel 的经验,因此提出了这个问题。
我想做的是添加将在AFTER端点如果满足条件触发的拦截器。
我可以通过这样做添加 AFTER 端点拦截器:
interceptSendToEndpoint(ENDPOINT_1)
.skipSendToOriginalEndpoint()
.to(ENDPOINT_1)
.afterUrl(AFTER_ENDPOINT_1);
我假设如果我想在这个链中添加条件,我会这样写:
interceptSendToEndpoint(ENDPOINT_1)
.skipSendToOriginalEndpoint()
.choice()
.when(conditionIsMet).to(ENDPOINT_1).afterUrl(AFTER_ENDPOINT_1)
.otherwise(ENDPOINT_1);
但是 apache camel 的 API 想法不同。 ;)(像苹果)
所以我想要实现的逻辑是: 如果满足条件 - 则应执行 AFTER_ENDPOINT_1,如果不满足条件则应执行 AFTER_ENDPOINT_1 不。
能否请您帮助我在这种情况下应该写什么?也许我滥用了拦截器——在这种情况下,请指引我正确的道路。
【问题讨论】:
【参考方案1】:你已经很接近了,但你可以在使用拦截时留下选择和其他部分。
假设您有 direct:start 消费者端点,并且您想在正文包含单词 hello 时拦截消息,您可以简单地执行以下操作:
interceptSendToEndpoint("direct:start")
.skipSendToOriginalEndpoint()
.when(body().contains("hello"))
.log("message was intercepted $body");
更多关于条件拦截的信息可以在here和here找到。
【讨论】:
【参考方案2】:经过 2 天的测试,我得出结论,最好的方法是:
interceptSendToEndpoint(ENDPOINT_2)
.when(conditionMet)
.skipSendToOriginalEndpoint()
.to(ENDPOINT_2)
.afterUrl(MY_AFTER_URI);
这样的路线:
from(MY_ROUTE_EXMPL)
.log("after MY_ROUTE_EXMPL log")
.to(ENDPOINT_1)
.log("after ENDPOINT_1")
.to(ENDPOINT_2)
.log("after ENDPOINT_2")
.to(RETURN_STRING_ENDPOINT)
.log("after RETURN_STRING_ENDPOINT");
使用配置,这是条件满足时的输出:
2021-10-11 01:40:05.322 INFO 2059 --- [nio-8990-exec-7] route3 : after MY_ROUTE_EXMPL log
inside: com.camel.interceptor.bean.TestConsumer.endpoint1
2021-10-11 01:40:05.323 INFO 2059 --- [nio-8990-exec-7] route3 : after ENDPOINT_1
inside: com.camel.interceptor.bean.TestConsumer.endpoint2
inside: com.camel.interceptor.bean.TestConsumer.afterUri
2021-10-11 01:40:05.323 INFO 2059 --- [nio-8990-exec-7] route3 : after ENDPOINT_2
inside : com.camel.interceptor.bean.TestConsumer.returnString
2021-10-11 01:40:05.323 INFO 2059 --- [nio-8990-exec-7] route3 : after RETURN_STRING_ENDPOINT
TO 端点表示为 void 类型的简单 @Consume 注释方法,只有单个
System.out.println("inside: com.camel.interceptor.bean.TestConsumer.ENDPOINT_METHOD_NAME");
打电话。
当条件不满足时,输出为:
2021-10-11 01:44:15.005 INFO 2059 --- [io-8990-exec-10] route3 : after MY_ROUTE_EXMPL log
inside: com.camel.interceptor.bean.TestConsumer.endpoint1
2021-10-11 01:44:15.005 INFO 2059 --- [io-8990-exec-10] route3 : after ENDPOINT_1
inside: com.camel.interceptor.bean.TestConsumer.endpoint2
2021-10-11 01:44:15.005 INFO 2059 --- [io-8990-exec-10] route3 : after ENDPOINT_2
inside : com.camel.interceptor.bean.TestConsumer.returnString
2021-10-11 01:44:15.005 INFO 2059 --- [io-8990-exec-10] route3 : after RETURN_STRING_ENDPOINT
两个输出都符合预期。
如问题所述: 现在,当条件满足时,执行将进入 ENDPOINT_2(仅一次)和 AFTER_URI。
如果不满足条件,则仅在 ENDPOINT_2 中执行,而不会命中 AFTER_URI。
这里是 repo 的链接,其中包含不同拦截方法的示例。这些示例是由我的同事 Tarun 制作的,我只添加了一个对我来说是最佳选择的示例,以及我在此处提供的相同示例作为答案。谢谢塔伦的帮助。
这里是带有示例的源代码链接: https://github.com/ffatheranderson/taruns_apache_camel_examples
【讨论】:
以上是关于如何在有条件的 apache camel 中添加后处理拦截器?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Apache Camels RouteBuilder.restConfiguration() 中添加 OpenApi/Swagger securitySchemes?
架构设计:系统间通信(38)——Apache Camel快速入门(下1)