我在JBoss ESB中使用基于内容的路由与Drools。我有几个规则,根据邮件的内容选择要使用的目的地。如果无法识别传入消息的内容,则此消息将路由到错误处理服务。以下是我的Drools规则。
global java.util.List destinations;
rule "A"
when
Message (body.get("data") != null && body.get("data").class == A.class)
then
destinations.add("a");
end
rule "B"
when
Message (body.get("data") != null && body.get("data").class == B.class)
then
destinations.add("b");
end
rule "Unknown"
when
eval(destinations.isEmpty())
then
destinations.add("unknown");
end
问题是每条消息都被路由到错误处理服务,即unknown
始终添加到destinations
。根据我的理解,规则从上到下执行,如果执行上述规则之一,则不应执行最后一条规则。
我该如何解决这个问题?一些谷歌搜索显示我应该使用salience
,这是正确的解决方案吗?
答案 0 :(得分:1)
面对这个问题时我也很沮丧。这不仅仅是在“未知”上使用负显着性的问题,因为示例中的eval()
不依赖于Drools事实,因此首先执行。
以下解决方案假定您的目的地是互斥的。这意味着您希望将您的邮件路由到a
,b
或unknown
,但不要将这些邮件路由到这三种组合:
import org.jboss.soa.esb.message.Message;
import org.jboss.soa.esb.message.Body;
global java.util.List destinations;
rule "A"
activation-group "destinations"
when
Message (body.get("data") != null && body.get("data").class == A.class)
then
destinations.add("a");
end
rule "B"
activation-group "destinations"
when
Message (body.get("data") != null && body.get("data").class == B.class)
then
destinations.add("b");
end
rule "Unknown"
activation-group "destinations"
salience -9000
when
eval(destinations.isEmpty())
then
destinations.add("unknown");
end
activation-group
宣布这种互斥关系;这样一组规则将根据他们的顺序(显着性)和事实被解雇,如果该组中的一条规则被解雇,其他规则将被忽略。