是否可以直接在通配符或表达式过滤器中使用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变量。你能帮我解决这个问题。
我不想使用属性过滤器。
答案 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/.+$')" />