- modify代表修改fact,会再次触发符合条件的rule
- 对象直接修改只是java 操作,不会会再次触发符合条件的rule
以下为测试代码-drl部分
package org.drools.learn
import org.drools.learn.ModifyTest.Message;
global java.util.List list
rule "Stateless modify"
// 注意使用了mvel,用java会报status 不是public
dialect "mvel"
when
m : Message( status == Message.HELLO, message : message )
then
System.out.println( message + " in thread " + Thread.currentThread().getId()+","+System.currentTimeMillis());
modify ( m ) { message = "Goodbye cruel world",
status = Message.GOODBYE };
end
rule "Stateless Good Bye"
// 注意使用了mvel
dialect "mvel"
when
o : Message( status == Message.GOODBYE, message : message )
then
System.out.println( " Stateless Good Bye in thread " + Thread.currentThread().getId()+","+System.currentTimeMillis());
// 使用set 不会触发rule执行
o.setMessage("changed by drl");
o.setStatus (100);
// modify ( o ) { message = "100 cruel world",
// status = 100 };
end
rule "Stateless 100 "
dialect "java"
auto-focus true
when
o : Message( status == 100, message : message )
then
System.out.println( " Stateless 100 should not be printed ,but it printed in " + Thread.currentThread().getId()+","+System.currentTimeMillis());
end
测试java代码
package org.drools.learn;
import org.drools.core.io.impl.ClassPathResource;
import org.kie.api.KieBase;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.KieServices;
import org.kie.api.conf.EqualityBehaviorOption;
import org.kie.api.conf.SequentialOption;
import org.kie.api.io.Resource;
import org.kie.api.logger.KieRuntimeLogger;
import org.kie.api.runtime.StatelessKieSession;
import org.kie.internal.conf.ConsequenceExceptionHandlerOption;
import org.kie.internal.conf.MultithreadEvaluationOption;
import org.kie.internal.utils.KieHelper;
import java.util.ArrayList;
import java.util.List;
public class ModifyTest {
private static KieBase kieBase;
private static KieBaseConfiguration kieBaseConf;
// private static KieSessionConfiguration kieBaseConf;
public static final void main(final String[] args) {
// From the kie services, a container is created from the classpath
KieServices ks=KieServices.get();
kieBaseConf= ks.newKieBaseConfiguration();
//设置SequentialOption以提升性能
kieBaseConf.setOption(SequentialOption.YES);
//设置使用对象的equals函数来进行对象比较
kieBaseConf.setOption(EqualityBehaviorOption.EQUALITY);
//设置exception 捕获,不设置为默认使用org.drools.core.runtime.rule.impl.DefaultConsequenceExceptionHandler
kieBaseConf.setOption(ConsequenceExceptionHandlerOption
.get(DroolsConsequenceExceptionHandler.class));
// kieBaseConf.setOption(MultithreadEvaluationOption.YES);
//使用resource模式装载,参考https://zhuanlan.zhihu.com/p/519969197
Resource resource =
new ClassPathResource("org/drools/learn/ModifyTest.drl");
KieBase base=new KieHelper().addResource(resource)
.build(kieBaseConf);
StatelessKieSession ksession = base.newStatelessKieSession();
ArrayList result=new ArrayList<Object>();
ksession.setGlobal( "list", result);
// The application can insert facts into the session
Message message = new Message();
message.setMessage( "Hello World" );
message.setStatus( Message.HELLO );
ksession.execute( message );
System.out.println("message status change to "+message.getStatus());
}
public static class Message {
public static final int HELLO = 0;
public static final int GOODBYE = 1;
private String message;
private int status;
public Message() {
}
public String getMessage() {
return this.message;
}
public void setMessage(final String message) {
this.message = message;
}
public int getStatus() {
return this.status;
}
public void setStatus(final int status) {
this.status = status;
}
public static Message doSomething(Message message) {
return message;
}
public boolean isSomething(String msg,
List<Object> list) {
list.add( this );
return this.message.equals( msg );
}
}
}