经过 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