当前位置: 首页 > 知识库问答 >
问题:

“简单”表达式语言-算术运算符?

朱修真
2023-03-14

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

.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获取一个值,并将其压缩到Exchange上的一个属性(加1)。

共有3个答案

宗穆冉
2023-03-14

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

太叔英卫
2023-03-14

您还可以编写一个谓词来完成这一任务。

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

这假设正文是一个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")
蒲勇
2023-03-14

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切换简单语言也有助于处理该问题。

 类似资料:
  • 了解ANTLR最好的方法就是实例。构建一个简单的计算器是个不错的主意。为了使它容易理解且保持简单,我们将只允许基本的算术运算符(加、减、乘、除)、括号表达式、整数和变量。 grammar Calc; prog : stat+ ; stat : expr | ID '=' expr ; expr : expr ('*'|'/') expr

  • 给定一棵仅由加减法运算符、数字组成的二进制算术表达式树,如何使树尽可能平衡?任务是在不求表达式值的情况下平衡树,即节点数应该保持不变。 示例: 加法是可交换的和相联的,这允许平衡。交换性允许交换连续“+”节点的子节点。关联性允许旋转。在上述示例中,所执行的转换可以被视为 null 另一种方法可以是将表达式树读入数组,并用变量替换任何'-'子树。然后使用DP确定括号的最佳位置。这必须是自下而上的,这

  • 目录表 简介 运算符 运算符优先级 计算顺序 结合规律 表达式 使用表达式 概括 简介 你编写的大多数语句(逻辑行)都包含表达式。一个简单的表达式例子如2 + 3。一个表达式可以分解为运算符和操作数。 运算符 的功能是完成某件事,它们由如+这样的符号或者其他特定的关键字表示。运算符需要数据来进行运算,这样的数据被称为 操作数 。在这个例子中,2和3是操作数。

  • 我们将简单浏览一下运算符和它们的用法: 技巧 你可以交互地使用解释器来计算例子中给出的表达式。例如,为了测试表达式2 + 3,使用交互式的带提示符的Python解释器: >>> 2 + 3 5 >>> 3 * 5 15 >>> 表5.1 运算符与它们的用法 运算符 名称 说明 例子 + 加 两个对象相加 3 + 5得到8。'a' + 'b'得到'ab'。 - 减 得到负数或是一个数减去另一个数 -

  • 问题内容: 我正在尝试编写一个正则表达式来检查给定的字符串是否像a + b,2 + a + b,3 + 6 * 9 + 6 * 5 + a * b等… 仅+和*运算符。 我试过了 不幸的是,它仅处理3 * 7 …(数字*数字)之类的情况。 等待您的答案,感谢您的阅读。 问题答案: 把和字符类中。 演示

  • 使用表达式 例5.1 使用表达式 #!/usr/bin/python # Filename: expression.py length =5 breadth =2 area = length * breadth print'Area is', area print'Perimeter is', 2* (length + breadth) (源文件:code/expression.py) 输出 $