如何在通配符过滤器和表达式过滤器 Mule 中使用 flowVars

How to use flowVars inside wildcard filter and expression filter Mule

是否可以直接使用通配符或表达式过滤器中的flowVariable。 我需要根据流量变量值停止流量。

示例:我的流程变量名称 keyValue 的值类似于 customer/feed/h26/h56 在此 'h26/h56' 中应该动态设置,但 customer/feed 始终保持不变。如果它包含任何字符,我只需要在 '/feed/' 之后设置我的过滤器。

  <flow name="testFlow1" doc:name="testFlow1">
    <file:inbound-endpoint responseTimeout="10000" doc:name="File" path="c:/in"/>
     .......( Many component)
    <set-variable variableName="keyValue" value="#[customer/feed/h26/h56]" doc:name="Variable"/>
     .......( Many component)    
     <message-filter doc:name="Message">
        <wildcard-filter pattern="customer/feed/+*" caseSensitive="true"/>
    </message-filter>
</flow>

在模式中使用+来检查它是否包含一个或多个字符。

我也用了表达式过滤器,不知道如何在过滤器表达式中使用流变量。你能帮我解决这个问题吗?

我不想使用 属性 过滤器。

改为使用表达式筛选器,因为您的表达式很简单,只需使用 String 的 startsWith 方法即可。

例如

    <expression-filter expression="flowVars.keyValue.startsWith('customer/feed/')" doc:name="Expression"/>

这将允许消息

首先,您不能直接在 flowVars 上使用 wildcard-filter,因为它会将通配符模式应用于消息负载。这是 org.mule.routing.filters.WildcardFilter class

的实施摘录
public boolean accept(MuleMessage message) {
    try {
        return accept(message.getPayloadAsString());
    } catch (Exception e) {
        logger.warn("An exception occurred while filtering", e);
        return false;
    }
}

很明显,WildcardFilter 将负载转换为字符串并应用过滤器。

此外,在 regex-filter 的情况下,它会将正则表达式模式应用于消息负载。这是 org.mule.routing.filters.RegExFilter

的实施摘录
public boolean accept(MuleMessage message) {
    try {
        return accept(message.getPayloadAsString());
    } catch (Exception e) {
        throw new IllegalArgumentException(e);
    }
}

现在回答您的问题,您可以按照 Tyrone Villaluna 的建议很好地使用 expression-filter。但是您可能希望在开始和结束符号中包含表达式,例如 ^customer/feed/.+$

等等

<expression-filter expression="flowVars.keyValue.matches('^customer/feed/.+$')" />