【问题标题】:"Simple" Expression Language - arithmetic operators?“简单”表达式语言 - 算术运算符?
【发布时间】:2014-01-07 13:58:41
【问题描述】:

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

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

【问题讨论】:

  • 我建议你用bean而不是简单的语言来计算。 Simple Language 中没有可用的运算符 + - 你有一个增量 ++ 运算符,它要求左侧是一个函数。
  • 谢谢,我做到了。如果您愿意将其写为答案,我会接受。否则,我考虑过使用差异表达语言(javascript?spel?),但我觉得这会使事情复杂化。

标签: java apache-camel simple-el


【解决方案1】:

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

最简单的解决方案是将操作重构为 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 也应该有助于解决这个问题。

【讨论】:

  • re: JavaScript,你知道如何使用对象属性(${body.something})和交换属性(${property.xyz})吗?我现在认为,当simple 的情况变得过于艰难时,一个简单的 javascript 表达式可能更可取...
【解决方案2】:

您也可以编写一个相当容易实现此目的的谓词。

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

【讨论】:

    【解决方案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()也可以...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多