我在骆驼路线中使用这个表达式:
.when(simple("${body.updateSeq} > ${property.PrevUpdateSeq} + 1"))
.to("direct:someError")
然而,它对+
符号感到害怕。
org.apache.camel.language.simple.types.SimpleIllegalSyntaxException: Unexpected token + at location 46
${body.updateSeq} > ${property.PrevUpdateSeq} + 1
*
如何构造此表达式,假设它从消息体上的POJO的getter getUpdateSeq
获取一个值,并将其压缩到Exchange上的属性(加1)。
答案 0 :(得分:4)
Simple Languate中包含的Apache Camel不支持+
操作本身。然而,它提供了一个++
增量运算符,它要求左侧是一个函数。
最简单的解决方案是将操作重构为bean
public class NextValueService
{
@Handler
public Integer nextValue(Integer value)
{
return new Integer(value.intValue() + 1);
}
}
并在您的路线中使用它,如下所示:
.when(simple("${body.updateSeq} > ${bean:nextValueService?method=nextValue(property.PrevUpdateSeq)"}))
.to("direct:someError")
用f.e.切换简单语言JavaScript或Groovy也应该有助于解决问题。
答案 1 :(得分:4)
您也可以很容易地编写谓词来完成此任务。
public class MyPredicate implements Predicate {
public boolean matches(final Exchange exchange) {
return (exchange.getIn().getBody(Map.class).get("updateSeq") > (exchange.getProperty("PrevUpdateSeq") + 1))
}
}
这假设body是一个map,如果它的bean很容易改变getBody()。然后像这样使用它:
.when(new MyPredicate()).to("direct:someError")
当您执行此类自定义代码时,应尝试将其与路由分开。简单的表达式语言非常有用,但如果过度使用,可能会变得神圣不可思议。
编辑:如果您愿意,甚至可以内联:
.when(new Predicate() {
public boolean matches(final Exchange exchange) {
return (exchange.getIn().getBody(Map.class).get("updateSeq") >
(exchange.getProperty("PrevUpdateSeq") + 1))
}).to("direct:someError")
答案 2 :(得分:2)
以下是通过javascript进行的操作:
.when()
.javaScript("parseInt(request.body.updateSeq) > parseInt(exchange.getProperty('PrevUpdateSeq')) + 1")
需要以下maven依赖:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-script</artifactId>
<version>${camel.version}</version>
</dependency>
或者我打赌也可以使用.groovy()
...