如何在apache camel中添加带条件的后处理拦截器?

4xrmg8kj  于 2022-11-07  发布在  Apache
关注(0)|答案(2)|浏览(188)

我有4天的经验与Apache Camel ,因此这个问题。
我想做的是添加拦截器,如果满足条件,端点 * 之后 * 触发该拦截器 *。
我可以通过执行以下操作添加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
在这种情况下,你能帮助我写些什么吗?也许我误用了拦截器--在这种情况下,请给我指引正确的道路。

laik7k3q

laik7k3q1#

你很接近,但你可以离开的选择,否则部分时,使用拦截。
假设您有direct:start消费者终结点,并且希望在body包含单词hello时拦截消息,您可以简单地执行以下操作:

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

有关条件拦截的更多信息,请参阅此处和此处。

kadbb459

kadbb4592#

经过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");

对于配置,这是条件MET时的输出:

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

两个输出均符合预期。
正如问题所述:现在,当条件为MET时,执行将进入ENDPOINT_2(仅一次)和AFTER_URI。
当条件为NOT MET时,则仅在ENDPOINT_2中执行,而不命中AFTER_URI。
这里有一个链接到回购协议的例子不同的拦截方法。这些例子是由我的同事Tarun,我只是增加了一个例子,看起来是一个最好的选择,我在这里提出的同一个例子作为答案。谢谢Tarun你的帮助。
下面是源代码的链接和示例:https://github.com/ffatheranderson/taruns_apache_camel_examples

相关问题