在Apache Camel中,如何检查即将到来的消息是否包含字符串



我正在使用Apache Camel来传递消息。该程序是用Java编写的。我想检查传入的消息是否包含文本("故障代码:0")和("警告代码:0"),如果包含,则不要转发它。我有如下路线

from("direct:operation-send-"+getId())
.id("direct:operation-send-"+getId())
.setHeader(Exchange.HTTP_METHOD, constant("POST"))
.doTry()
.choice()
.when( ! body().contains("Fault Code: 0") )               
.to(httpUrl.getUri())
.endChoice()
.endDoTry()
.doCatch(Exception.class)
.to("log:HTTP_SEND_CONNECTION_ERROR?level=ERROR&showHeaders=true")
.to("direct:operation-store-"+getId())

但是这部分 when( ! body().contains("故障代码:0") ) 给了我一个编译错误。我想知道如何检查骆驼路线中的条件(消息中的文本)......将不胜感激任何帮助!!

来自 BuilderSupport 类的静态方法 body() 生成一个 ValueBuilder 对象。这个对象提供了一种流畅的方式来构建一个Predicate,这是函数式Java世界中的习语之一。

我不打算详细介绍Predicate是如何工作的(你可以在这里阅读更多关于它们的信息),但它们不能用作一个简单的boolean。这意味着,谓词不能用否定符号 -!来否定,这就是你在这里要做的。

所以代替:

.when( ! body().contains("Fault Code: 0") ) 

你需要使用ValueBuilder的方法来形成你的条件。

另外,请注意,您正在尝试检查您的身体是否包含String对象。我不确定你是否需要告诉ValueBuilder这件事,但这似乎是骆驼的常见做法(我自己从未使用过)。

知道这两件事,解决方案似乎很简单。只需将违规行替换为:

.when(bodyAs(String.class).not().contains("Fault Code: 0"))

Camel是一个庞大的库,大量使用Java 8功能。确保您首先知道如何正确使用它们(有很多教程,例如这个)。


编辑:body(Class)方法在较新版本的Camel中被弃用(至少在2.18.3中),所以你应该使用bodyAs(Class)代替。

当您看到警告时,请务必检查 javadocs,因为它们应该包含有关替换弃用什么的信息。

抑制警告通常不是一个好主意!

已弃用的方法将在将来的版本中删除,发生这种情况时,它将破坏您的构建。

最新更新