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

时间:2015-08-26 05:55:46

标签: regex mule mule-studio mule-component mule-el

是否可以直接在通配符或表达式过滤器中使用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>

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

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

我不想使用属性过滤器。

2 个答案:

答案 0 :(得分:1)

使用表达式过滤器,因为表达式很简单,只需使用String的startsWith方法。

例如

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

这将允许消息

答案 1 :(得分:0)

首先,您无法直接在wildcard-filter上使用flowVars,因为它会将通配符模式应用于消息有效内容。以下是org.mule.routing.filters.WildcardFilter

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

很明显,WildcardFilter将有效负载转换为String并应用过滤器。

此外,在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/.+$')" />