Drools 7 Modify 和对象直接赋值差异

2023-11-26 08:01

本文主要是介绍Drools 7 Modify 和对象直接赋值差异,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • modify代表修改fact,会再次触发符合条件的rule
  • 对象直接修改只是java 操作,不会会再次触发符合条件的rule

以下为测试代码-drl部分


package org.drools.learnimport org.drools.learn.ModifyTest.Message;global java.util.List listrule "Stateless modify"
// 注意使用了mvel,用java会报status 不是publicdialect "mvel"whenm : Message( status == Message.HELLO, message : message )thenSystem.out.println( message + " in thread " + Thread.currentThread().getId()+","+System.currentTimeMillis());modify ( m ) { message = "Goodbye cruel world",status = Message.GOODBYE };endrule "Stateless Good Bye"
// 注意使用了mveldialect "mvel"wheno : Message( status == Message.GOODBYE, message : message )thenSystem.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 };endrule "Stateless 100 "dialect "java"auto-focus truewheno : Message( status == 100, message : message )thenSystem.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 classpathKieServices ks=KieServices.get();kieBaseConf= ks.newKieBaseConfiguration();//设置SequentialOption以提升性能kieBaseConf.setOption(SequentialOption.YES);//设置使用对象的equals函数来进行对象比较kieBaseConf.setOption(EqualityBehaviorOption.EQUALITY);//设置exception 捕获,不设置为默认使用org.drools.core.runtime.rule.impl.DefaultConsequenceExceptionHandlerkieBaseConf.setOption(ConsequenceExceptionHandlerOption.get(DroolsConsequenceExceptionHandler.class));// kieBaseConf.setOption(MultithreadEvaluationOption.YES);//使用resource模式装载,参考https://zhuanlan.zhihu.com/p/519969197Resource 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 sessionMessage 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 );}}}

这篇关于Drools 7 Modify 和对象直接赋值差异的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/425364

相关文章

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使

MyBatis的配置对象Configuration作用及说明

《MyBatis的配置对象Configuration作用及说明》MyBatis的Configuration对象是MyBatis的核心配置对象,它包含了MyBatis运行时所需的几乎所有配置信息,这个对... 目录MyBATis配置对象Configuration作用Configuration 对象的主要作用C

Mysql中InnoDB与MyISAM索引差异详解(最新整理)

《Mysql中InnoDB与MyISAM索引差异详解(最新整理)》InnoDB和MyISAM在索引实现和特性上有差异,包括聚集索引、非聚集索引、事务支持、并发控制、覆盖索引、主键约束、外键支持和物理存... 目录1. 索引类型与数据存储方式InnoDBMyISAM2. 事务与并发控制InnoDBMyISAM

SpringBoot实现导出复杂对象到Excel文件

《SpringBoot实现导出复杂对象到Excel文件》这篇文章主要为大家详细介绍了如何使用Hutool和EasyExcel两种方式来实现在SpringBoot项目中导出复杂对象到Excel文件,需要... 在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::