如何在通配符过滤器和表达式过滤器 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/.+$')" />
是否可以直接使用通配符或表达式过滤器中的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/.+$')" />