我尝试使用PredicateBuilder复合条件,并将其保存到标头中,以便从when访问 predicate ()函数。一开始我将body设置为Hello World
。而且body不是null或不等于AUTHENTICATE failed
,但我进入了when块,并且process_no_mail_or_failed
正在被记录。我不明白我做错了什么。我如何在Apache Camel中复合 predicate 并在when()函数中使用它们呢?以防我在某个步骤中必须检查主体。因此,我这样做了。
谢谢你的帮助!
Apache Camel 路线:
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Predicate;
import org.apache.camel.Processor;
import org.apache.camel.builder.PredicateBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class TestRoute extends RouteBuilder {
static final Logger LOGGER = LoggerFactory.getLogger(EmailPollingRoute.class);
static final String AUTHENTICATE_FAILED = "AUTHENTICATE failed.";
@Override
public void configure() throws Exception {
from("quartz://emailTimer?cron=0/30+*+*+*+*+?+*")
.log("TestRoute - Before calling transform")
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
Message message = exchange.getIn();
message.setBody("Hello World");
String body = message.getBody(String.class);
LOGGER.info("body: \n" + body);
Predicate p1 = body().isNull();
Predicate p2 = body().isEqualTo(AUTHENTICATE_FAILED);
Predicate predicate_result12 = PredicateBuilder.or(p1, p2);
message.setHeader("process_no_mail_or_failed", predicate_result12);
}
})
.choice()
.when(header("process_no_mail_or_failed").convertTo(Predicate.class))
//.when(simple("${body} == null || ${body} == 'AUTHENTICATE failed.'")) //This works for me. I am getting into the otherwise block
.log("when: ${body}")
.otherwise()
.log("otherwise: ${body}");
}
}
1条答案
按热度按时间zsohkypk1#
predicate 具有matches方法,您可以使用该方法来计算 predicate
如果要获取 predicate 的结果,可以使用matches-method来计算 predicate 。
您也可以只从Predicate构建器导入静态方法,并在选择范围内使用它们,而不必将结果存储到exchange属性中。
从 predicate 构建器导入静态方法的技巧很容易被忽略,因为它只在文档的否定 predicate 部分提到。