我使用的是专有规则引擎,我现在正在尝试使用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
它运行正常,但我的问题是:是否有一种更简单的方法可以在对象的每个实例上触发规则,即使它是另一个对象的属性?
答案 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
使用此方法,您只能使用消息类型编写规则。
干杯