4

我在骆驼路线中使用这个表达式:

.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
                                              *

我如何构造这个表达式,假设它从getUpdateSeq消息体上的 POJO 的 getter 中获取一个值,并将其压缩为 Exchange 上的一个属性(加 1)。

4

3 回答 3

5

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")

使用 fe JavaScript 或 Groovy 切换简单的语言也应该有助于解决问题。

于 2014-01-07T14:59:06.107 回答
5

您还可以编写一个相当容易的谓词来完成此操作。

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

这假设 body 是一个映射,如果它是一个 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")
于 2014-01-07T20:15:48.080 回答
3

以下是如何通过 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()......

于 2014-01-08T07:59:15.707 回答