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

Java 如何将规则应用于会话中对象的所有属性?,java,drools,Java,Drools,我使用的是一个专有的规则引擎,现在我正在尝试使用Drools,我对Drools还很陌生 使用以前的规则引擎,为现有对象的所有实例触发规则,即使它们是其他对象的属性 我有一组应用于给定类型对象O的规则。我将O添加到会话和对象O'中,并将O作为属性。但由于这些规则不适用于O',因此它们不会应用于O'的属性O 我将用一个HEllo word示例来说明这一点: 我在基本drool示例中添加了以下类: public static class Email { private Messag

我使用的是一个专有的规则引擎,现在我正在尝试使用Drools,我对Drools还很陌生

使用以前的规则引擎,为现有对象的所有实例触发规则,即使它们是其他对象的属性

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

我将用一个HEllo word示例来说明这一点:

我在基本drool示例中添加了以下类:

 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();
            ...
我有一个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

它工作得很好,但我的问题是:有没有更简单的方法让规则在对象的每个实例上启动,即使它是另一个对象的属性?

是的,您可以执行以下操作:

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
使用这种方法,您可以只使用消息类型编写规则


干杯

@RickyBobby我能问一下吗?如何将插入的
$message
获取到java代码?或者如果可能,将插入的对象从规则获取到java?