如何在有条件的 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?

apache camel 条件路由

架构设计:系统间通信(38)——Apache Camel快速入门(下1)

如何在 apache camel 中执行 gcp pubsub 消息的并行处理

如何在apache camel中附加速度文件内容

apache camel - 向死信队列添加消息警报