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

时间:2017-04-05 16:55:12

标签: java 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())

但是这部分(!body()。包含("故障代码:0"))给了我一个编译错误。我想知道如何检查Camel路线中的条件(消息中的文字)...........非常感谢任何帮助!!

1 个答案:

答案 0 :(得分:1)

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

我不打算详细了解Predicate的工作方式(您可以更多地了解它们here),但它们不能用作简单的boolean 。这意味着,谓词不能用否定符号来否定 - !,这就是你在这里尝试做的事情。

所以而不是:

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

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

另外,请注意您正在尝试检查您的身体是否包含String个对象。我不确定您是否需要告诉ValueBuilder .when(bodyAs(String.class).not().contains("Fault Code: 0")) but it seems like a common practice in Camel(我自己从未使用过)。

了解这两件事,解决方案似乎很简单。只需用以下内容替换违规行:

{{1}}

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

编辑:新版本的Camel(至少在2.18.3中)不推荐使用body(Class)方法,因此您应该使用bodyAs(Class)代替。

当您看到警告时,请务必检查javadoc,因为它们应包含有关弃用的内容的信息。

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

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