vik*_*eve 4 java apache-camel simple-el
我在骆驼路线中使用这个表达式:
.when(simple("${body.updateSeq} > ${property.PrevUpdateSeq} + 1"))
.to("direct:someError")
Run Code Online (Sandbox Code Playgroud)
然而,它对+
符号感到害怕。
org.apache.camel.language.simple.types.SimpleIllegalSyntaxException: Unexpected token + at location 46
${body.updateSeq} > ${property.PrevUpdateSeq} + 1
*
Run Code Online (Sandbox Code Playgroud)
我如何构造这个表达式,让它从getUpdateSeq
消息正文上的 POJO的 getter中获取一个值,并将其压缩为 Exchange 上的一个属性(加 1)。
Apache Camel中包含的简单语言本身不支持操作。然而,它提供了一个增量运算符,它要求左侧是一个函数。+
++
最简单的解决方案是将操作重构为 bean
public class NextValueService
{
@Handler
public Integer nextValue(Integer value)
{
return new Integer(value.intValue() + 1);
}
}
Run Code Online (Sandbox Code Playgroud)
并在您的路线中使用它,如下所示:
.when(simple("${body.updateSeq} > ${bean:nextValueService?method=nextValue(property.PrevUpdateSeq)"}))
.to("direct:someError")
Run Code Online (Sandbox Code Playgroud)
使用 fe JavaScript 或 Groovy 切换简单语言也应该有助于解决问题。
您还可以编写一个相当容易的谓词来实现这一点。
public class MyPredicate implements Predicate {
public boolean matches(final Exchange exchange) {
return (exchange.getIn().getBody(Map.class).get("updateSeq") > (exchange.getProperty("PrevUpdateSeq") + 1))
}
}
Run Code Online (Sandbox Code Playgroud)
这假设主体是一个地图,如果它是一个 bean,那么改变 getBody() 就很容易了。然后像这样使用它:
.when(new MyPredicate()).to("direct:someError")
Run Code Online (Sandbox Code Playgroud)
当你在做这样的自定义代码时,你应该尝试将它与路由分开。简单的表达语言非常有用,但如果过度使用,阅读起来会很糟糕。
编辑:如果需要,您甚至可以内联进行:
.when(new Predicate() {
public boolean matches(final Exchange exchange) {
return (exchange.getIn().getBody(Map.class).get("updateSeq") >
(exchange.getProperty("PrevUpdateSeq") + 1))
}).to("direct:someError")
Run Code Online (Sandbox Code Playgroud)