我正在使用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,因为它们应该包含有关替换弃用什么的信息。
抑制警告通常不是一个好主意!
已弃用的方法将在将来的版本中删除,发生这种情况时,它将破坏您的构建。