Apache Camel :在when()中使用复合条件

nhhxz33t  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(353)

我正在使用Apache Camel DSL路由,并希望检查主体是否不是null,并且主体是否不包含authenticate failed之类的子字符串。在java中,类似于:

if(body != null && !body.contains("authenticate failed")) {
                  //Do something.

              }

Apache Camel DSL:

.choice()
        .when(body().contains("authenticate failed"))
             .log("after choice body().contains('authenticate failed') body: ${body}")
        .when(body().isNotNull()) //Here I want to add the addiontional condition to this when `body not contains authenticate failed`.

我怎么写这样的条件呢?在process方法中 predicate 对象,在我的情况下写tin?

pvcm50d1

pvcm50d11#

您可以使用PredicateBuilder来创建漂亮的复合 predicate 。下面是如何使用PredicateBuilder执行简单的Body不为空或空检查的示例。

package com.example;

import org.apache.camel.Predicate;
import org.apache.camel.RoutesBuilder;
import org.apache.camel.builder.PredicateBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;

public class ExampleTests extends CamelTestSupport {

    @Test
    public void testValidBody() throws Exception {

        MockEndpoint resultMockEndpoint = getMockEndpoint("mock:notNull");
        resultMockEndpoint.expectedMessageCount(1);

        template.sendBody("direct:predicateExample", "Hello world!");

        resultMockEndpoint.assertIsSatisfied();
    }

    @Test
    public void testEmptyBody() throws Exception {

        MockEndpoint resultMockEndpoint = getMockEndpoint("mock:nullOrEmpty");
        resultMockEndpoint.expectedMessageCount(1);

        template.sendBody("direct:predicateExample", null);

        resultMockEndpoint.assertIsSatisfied();
    }

    @Test
    public void testNullBody() throws Exception {

        MockEndpoint resultMockEndpoint = getMockEndpoint("mock:nullOrEmpty");
        resultMockEndpoint.expectedMessageCount(1);

        template.sendBody("direct:predicateExample", null);

        resultMockEndpoint.assertIsSatisfied();
    }

    @Override
    protected RoutesBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {

            @Override
            public void configure() throws Exception {

                Predicate bodyNotNullOrEmpty = PredicateBuilder.and(
                    body().isNotNull(), 
                    body().isNotEqualTo("")
                );

                from("direct:predicateExample")
                    .routeId("predicateExample")
                    .choice().when(bodyNotNullOrEmpty)
                        .log("Received body: ${body}")
                        .to("mock:notNull")
                    .otherwise()
                        .log("Body was null or empty!")
                        .to("mock:nullOrEmpty")
                    .end()
                    .log("done");
            }
        };
    }
}

Not和Or可以将 predicate 列表作为参数,甚至可以使用其他组合 predicate ,这允许您创建一些相当复杂的组合 predicate 。但是,当使用PredicateBuilder开始变得过于冗长时,最好使用处理器或bean来抽象掉一些复杂性。

相关问题