2014-01-07 35 views
2

我使用的骆驼路线这个表达式:“简单”表达式语言 - 算术运算符?

.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吸气getUpdateSeq取值并将其压缩模式对交易所的属性(加1)。

+0

我建议你在bean中进行计算而不是简单的语言。在[简单语言](http://camel.apache.org/simple.html)中没有可用的运算符'+' - 你有一个增量'++'运算符,它需要左手边是一个函数。 –

+0

谢谢,我做到了。如果你喜欢把它写成答案,我会接受它。否则,我想过使用差异表达式语言(javascript?spel?),但我觉得这会让事情变得复杂。 – vikingsteve

回答

4

包含在Apache Camel中的Simple Languate不支持+操作本身。它提供了一个++增量运算符,它要求左侧是一个函数。

最简单的解决办法是重构操作豆

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应该也可以帮助解决这个问题。

+0

re:JavaScript,你知道如何使用对象属性('$ {body.something}')和交换属性('$ {property.xyz}')吗?我现在正在考虑一个简单的javascript表达式可能会更好,当“简单”的过程变得太难时... – vikingsteve

4

你也可以很容易地写一个谓词来完成这个。

public class MyPredicate implements Predicate { 
    public boolean matches(final Exchange exchange) { 
    return (exchange.getIn().getBody(Map.class).get("updateSeq") > (exchange.getProperty("PrevUpdateSeq") + 1)) 
    } 
} 

这假设身体是一张地图,如果它的一个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") 
+0

+1我发现几乎是更清洁的解决方案,TBH。 –

+0

谢谢,2个很好的解决方案,谢谢。 – vikingsteve

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() ...