Apache Camel 带有运算符的多重过滤器/选择器

问题描述 投票:0回答:2

我正在尝试使用过滤器在我的 Camel Route 中过滤来自 activeMQ 的消息,但当我使用 || 等运算符时,我无法使其工作。或&&

所以基本上我从 activemq 接收带有多个标头的消息,我希望我的路由按标头值过滤消息。但对于某些标头,我想接受不同的值,因此我需要使用类似“header('myHeader' = 'value1' || 'value2')”的内容,但它不起作用。

我尝试使用filter()、choice().when()和一些Simple()代码没有任何效果。

这是我的路线代码(只是过滤部分):

// first try                        
.filter(header("CACT").isEqualTo("OBS"))
.filter(header("CDPO").in("SAT", "LYO"))
.filter(header("CDDO").isEqualTo("OBSDOM"))
.filter(header("NAME").isEqualTo("SORSTK"))
.filter(header("FLUX").isNull() || header("FLUX").isEqualTo("SCICS"))

// second try           
.choice()
    .when(header("CACT").isEqualTo("OBS") && 
          header("CDPO").in("SAT", "LYO") && 
          header("CDDO").isEqualTo("OBSDOM") && 
          header("NAME").isEqualTo("SORSTK") &&
          (header("FLUX").isNull() || header("FLUX").isEqualTo("SCICS"))

// third try
.filter().simple('''${in.header[CACT]} == ("OBS") && 
                    ${in.header[CDPO]} == ("LYO" || "SAT") &&
                    ${in.header[CDDO]} == ("OBSDOM") &&
                    ${in.header[NAME]} == ("SORSTK") &&
                    (${in.header[FLUX]} != (null) || ${in.header[FLUX]} == "SAT") ''')

我尝试了这三种解决方案,但没有一个有效。当我删除带有 || 的行时运营商,它有效。所以我不知道该如何处理。 如果这些条件得到验证,我只想使用我的消息。

如果您知道为什么它不起作用,我们将不胜感激您的帮助。

问候, 萨米

filter header apache-camel selector operator-keyword
2个回答
0
投票

好吧,我找到了一个解决方案,我使用了filter()和simple(),但每行不超过2个条件,并且我使用“and”和“or”而不是“&&”和“||”。 这是工作代码:

.filter(simple('''${header.CACT} == "OBS"'''))
.filter(simple('''${header.CDPO} == "SAT" or ${header.CDPO} == "LYO"'''))
.filter(simple('''${header.CDDO} == "OBSDOM" and ${header.NAME} == "SORSTK"'''))
.filter(simple('''${header.FLUX} == null or ${header.FLUX} == "SCICS"'''))

如果您有其他建议,我仍然感兴趣。 谢谢。


0
投票

我知道这是一个老问题,老实说我不知道 8 年前 Apache Camel 是如何工作的。但也许对其他人有用。

您可以通过实现 org.apache.camel.Predicate 创建自定义谓词,如下所示:

public class CustomPredicate implements Predicate {
@Override
public boolean matches(Exchange exchange) {
    // your logic to decide the return value (true/false)
    return false;
}}

并使用此类的实例

.filter(customPredicateInstance)
© www.soinside.com 2019 - 2024. All rights reserved.