我需要帮助在简单的apache camel中创建一个规则,我可以验证一个整数值是否小于或等于,但是,我无法使其工作,如下所示:${in.header.name} ==空且${in.header.id}〈= 50通过文档我测试了上面的功能,它不工作
bvn4nwqk1#
您应该使用&&而不是and,您可能还希望从${in.header.name}中删除部分,并使用${header.name}。
&&
and
${in.header.name}
${header.name}
我还建议在简单语言字符串上使用Predicates和Java-DSL,因为它们比简单语言字符串更不容易出现拼写错误,而且可以使用PredicateBuilder构建相当复杂的 predicate 。
PredicateBuilder
使用简单语言和 predicate 的示例测试:
package org.example; import java.util.HashMap; 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.junit5.CamelTestSupport; import org.junit.jupiter.api.Test; public class ComparisonTest extends CamelTestSupport { @Test public void simpleComparisonSixIsGreater() throws Exception { MockEndpoint isGreaterMockEndpoint = getMockEndpoint("mock:isGreater"); isGreaterMockEndpoint.expectedMessageCount(1); HashMap<String, Object> headers = createHashmapForNameAndIdHeaders(null, 6); template.sendBodyAndHeaders("direct:simpleComparison", null, headers); isGreaterMockEndpoint.assertIsSatisfied(); } @Test public void simpleComparisonThreeIsLowerThan() throws Exception { MockEndpoint isLowerMockEndpoint = getMockEndpoint("mock:isLower"); isLowerMockEndpoint.expectedMessageCount(1); HashMap<String, Object> headers = createHashmapForNameAndIdHeaders(null, 3); template.sendBodyAndHeaders("direct:simpleComparison", null, headers); isLowerMockEndpoint.assertIsSatisfied(); } @Test public void predicateComparisonSixIsGreater() throws Exception { MockEndpoint isGreaterMockEndpoint = getMockEndpoint("mock:isGreater"); isGreaterMockEndpoint.expectedMessageCount(1); HashMap<String, Object> headers = createHashmapForNameAndIdHeaders(null, 6); template.sendBodyAndHeaders("direct:predicateComparison", null, headers); isGreaterMockEndpoint.assertIsSatisfied(); } @Test public void predicateComparisonThreeIsLowerThan() throws Exception { MockEndpoint isLowerMockEndpoint = getMockEndpoint("mock:isLower"); isLowerMockEndpoint.expectedMessageCount(1); HashMap<String, Object> headers = createHashmapForNameAndIdHeaders(null, 3); template.sendBodyAndHeaders("direct:predicateComparison", null, headers); isLowerMockEndpoint.assertIsSatisfied(); } @Override protected RoutesBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @Override public void configure() throws Exception { // Using simple language from("direct:simpleComparison") .routeId("simpleComparison") .choice().when(simple("${header.name} == null && ${header.id} > 5")) .log("Body value is greater than 5") .to("mock:isGreater") .otherwise() .log("Body value is less than 5") .to("mock:isLower") .end() ; // Using predicate Predicate nameIsNullAndIdGreaterThanFive = PredicateBuilder.and( header("name").isEqualTo(null), header("id").isGreaterThan(5) ); from("direct:predicateComparison") .routeId("predicateComparison") .choice().when(nameIsNullAndIdGreaterThanFive) .log("Body value is greater than 5") .to("mock:isGreater") .otherwise() .log("Body value is less than 5") .to("mock:isLower") .end(); } }; } private HashMap<String, Object> createHashmapForNameAndIdHeaders(String name, Integer id) { HashMap<String, Object> headers = new HashMap<>(); headers.put("name", name); headers.put("id", id); return headers; } }
1条答案
按热度按时间bvn4nwqk1#
您应该使用
&&
而不是and
,您可能还希望从${in.header.name}
中删除部分,并使用${header.name}
。我还建议在简单语言字符串上使用Predicates和Java-DSL,因为它们比简单语言字符串更不容易出现拼写错误,而且可以使用
PredicateBuilder
构建相当复杂的 predicate 。使用简单语言和 predicate 的示例测试: