我在骆驼路线中使用了这个表达:
.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)。
下面是如何通过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()
也可以...
您还可以编写一个谓词来完成这一任务。
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")
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) 输出 $