2014-01-07 63 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() ...