如何在有条件的 Apache 骆驼中添加后处理拦截器?

How to add postprocess interceptor in apache camel with condition?

我有 4 天使用 apache camel 的经验,因此提出了这个问题。

我想做的是添加将被触发的拦截器 AFTER 端点 if 条件满足.

我可以通过这样做添加 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 应该 被执行。

请问在这种情况下我应该写什么?也许我误用了拦截器 - 在这种情况下,请指导我正确的路径。

你已经很接近了,但是你可以保留选择,否则在使用拦截时分开。

假设您有 direct:start 个消费者端点,并且您想要在正文包含单词 hello 时拦截消息,您可以简单地执行以下操作:

interceptSendToEndpoint("direct:start")
    .skipSendToOriginalEndpoint()                
    .when(body().contains("hello"))
        .log("message was intercepted ${body}");

可以找到有关条件拦截的更多信息here and here

经过 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(仅一次)AND AFTER_URI.

当条件不满足时,执行仅在 ENDPOINT_2 中进行,而不会命中 AFTER_URI。

这里是 link 回购不同拦截方法的例子。这些示例是由我的同事 Tarun 制作的,我只添加了一个对我来说看起来是最佳选择的示例,以及我在此处提供的相同示例作为答案。谢谢 Tarun 的帮助。

这里是带有示例的 link 源代码: https://github.com/ffatheranderson/taruns_apache_camel_examples