【问题标题】:How to add postprocess interceptor in apache camel with condition?如何在有条件的 apache camel 中添加后处理拦截器?
【发布时间】: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

能否请您帮助我在这种情况下应该写什么?也许我滥用了拦截器——在这种情况下,请指引我正确的道路。

【问题讨论】:

    标签: routes apache-camel interceptor post-processing


    【解决方案1】:

    你已经很接近了,但你可以在使用拦截时留下选择和其他部分。

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

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

    更多关于条件拦截的信息可以在herehere找到。

    【讨论】:

      【解决方案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

      【讨论】:

        猜你喜欢
        • 2016-07-26
        • 2018-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多