1

我在 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,这是正确的解决方案吗?

4

1 回答 1

1

面对这个问题,我也傻眼了。这不仅仅是在“未知”上使用负显着性的问题,因为eval()在您的示例中不依赖于 Drools 事实,因此首先执行。

以下解决方案假定您的目的地是互斥的。这意味着您希望您的消息被路由到abunknown,但永远不要路由到三者的某种组合:

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互斥关系;这样一组规则将根据它们的顺序(显着性)和事实被触发,如果组中的一个规则被触发,其他规则将被忽略。

灵感来自对Drools 规则层次结构和条件执行的回答。

于 2014-01-29T19:20:27.277 回答