如何将规则应用于会话中对象的所有属性?

时间:2011-10-13 08:33:37

标签: java drools

我使用的是专有规则引擎,我现在正在尝试使用Drools,我对Drools来说很新。

使用以前的规则引擎,即使它们是另一个对象的属性,也会为现有对象的所有实例触发规则。

我有一组应用于给定类型的对象O的规则。我添加到我的会话和对象O',其中O为属性。但由于规则未应用于O',因此它们不会应用于O'的属性O。

我将用一个HEllo字样例来说明这一点:

我添加了基本流氓示例以下类:

 public static class Email {

        private Message message ;


        public void setMessage(Message message) {
            this.message = message;
        }

        public Message getMessage() {
            return message;
        }
}

电子邮件是O',邮件是O。

我的会话“有效”如下:

            ...
            Message message = new Message();
            message.setMessage("Hello World");
            message.setStatus(Message.HELLO);
            Email email = new Email();
            email.setMessage(message);
            ksession.insert(email);
            ksession.fireAllRules();
            logger.close();
            ...

我有一个Sample drool文件:

rule "Hello World"
    when
        m : Message( status == Message.HELLO, myMessage : message )
    then
        System.out.println( myMessage );
        m.setMessage( "Goodbye cruel world" );
        m.setStatus( Message.GOODBYE );
        update( m );
end

该规则仅适用于消息。

如果我按原样启动会话,则不会触发任何规则。 要解除规则,我需要添加规则:

rule "email"
    when 
        e : Email( message != null)
    then 
        insert(e.getMessage());
end

它运行正常,但我的问题是:是否有一种更简单的方法可以在对象的每个实例上触发规则,即使它是另一个对象的属性?

1 个答案:

答案 0 :(得分:1)

是的,你可以这样做:

rule "Hello World"
    when
        $email: Email(message.status ==  Message.HELLO, $myMessage: message.message )

    then
        System.out.println( $myMessage );
        m.setMessage( "Goodbye cruel world" );
        m.setStatus( Message.GOODBYE );
        update( m );
end

或者您可以使用规则

将消息插入工作内存
Rule "insert message"
   when 
      Email ($message: message)
   then
      insert($message);
end

使用此方法,您只能使用消息类型编写规则。

干杯