Apache Camel multiple filter / selector with operator

ddarikpa  于 12个月前  发布在  Apache
关注(0)|答案(2)|浏览(137)

我试图使用过滤器在我的Camel Route中过滤来自ActiveMQ的消息,但当我使用操作符(如||或&&
所以基本上我从activemq接收一条消息,它有几个头,我希望我的路由通过头值过滤消息。但是对于一些头,我想接受不同的值,所以我需要使用类似“header('myHeader' = 'value1'||'value2')”但它不起作用。
我尝试了filter()、choice().when()和一些Simple()代码,但没有任何效果。
下面是我的Route代码(只是过滤部分):

// 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") ''')

字符串
我尝试了这三种解决方案,但都不起作用。||操作符,它工作。所以我不知道如何处理。我只是想消费我的消息,如果这些条件得到验证。
如果你知道为什么它不工作,你的帮助将不胜感激。
问候,萨米

ghhkc1vu

ghhkc1vu1#

我知道这是一个老问题,老实说,我不知道Apache Camel 8年前是如何工作的。
你可以通过实现org.apache.camel.Predicate来创建一个自定义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)

svgewumm

svgewumm2#

好了,我找到了一个解决方案,我使用了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"'''))

字符串
如果你有其他建议我还是很感兴趣的。谢谢。

相关问题