如何在有条件的 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}");
经过 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
我有 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}");
经过 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