使用Drools的JBoss ESB基于内容的路由的默认目标

时间:2013-08-13 23:17:32

标签: jboss esb drools

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

1 个答案:

答案 0 :(得分: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 - rule hierarchy and conditional execution的回答。