《Drools7.0.0.Final规则引擎教程》番外实例篇——相同对象and List使用

前奏

群组(QQ:593177274)交流中有朋友提出一个问题,怎么实现两个相同对象的插入和比较?相信很多朋友也遇到类似的问题,于是抽时间为大家写一段实例代码,后续代码会同步到GitHub中。下面简单介绍一下实现实例:

场景

向session中insert两个相同的对象,但对象的参数值有不同的地方,同时要求对两个FACT对象的属性进行判断,当同时满足(&&)时,通过规则校验,进行后续业务处理。下面,通过两种方式来实现此功能。

代码实现

方式一

规则文件内容:

package com.rules

import com.secbro.drools.model.Customer;

rule "two same objects"
    agenda-group "two same objects"
    when
        $firstCustomer:Customer(age == 59);
        $secondCustomer:Customer(this != $firstCustomer,age == 61);
    then
        System.out.println("firstCustomer age :" + $firstCustomer.getAge());
        System.out.println("secondCustomer age :" + $secondCustomer.getAge());
    end

测试端调用部分代码:

@Test
    public void testSameObjects() {
        KieSession kieSession = getKieSession("two same objects");

        Customer customer = new Customer();
        customer.setAge(61);
        kieSession.insert(customer);

        Customer customer1 = new Customer();
        customer1.setAge(59);
        kieSession.insert(customer1);

        int count = kieSession.fireAllRules();

        kieSession.dispose();
        System.out.println("Fire " + count + " rules!");
    }

如此,则实现了上面场景的内容。值得注意的是规则文件中this != $firstCustomer的写法,此处可以排除两个对象属性相同导致的问题。

方法二

此方式采用List来传递两个相同的参数,规则文件内容如下:

package com.rules

import com.secbro.drools.model.Customer;
import java.util.List;

rule "two same objects in list"
    agenda-group "two same objects in list"
    when
        $list : List();
        $firstCustomer:Customer(age == 59) from $list;
        $secondCustomer:Customer(this != $firstCustomer,age == 61) from $list;
    then
        System.out.println("two same objects in list:firstCustomer age :" + $firstCustomer.getAge());
        System.out.println("two same objects in list:secondCustomer age :" + $secondCustomer.getAge());
    end

测试类部分代码:

@Test
    public void testSameObjectsInList() {
        KieSession kieSession = getKieSession("two same objects in list");

        List<Customer> list = new ArrayList<>();
        Customer customer = new Customer();
        customer.setAge(61);
        list.add(customer);

        Customer customer1 = new Customer();
        customer1.setAge(59);
        list.add(customer1);
        kieSession.insert(list);

        int count = kieSession.fireAllRules();

        kieSession.dispose();
        System.out.println("Fire " + count + " rules!");
    }

后语

此系列课程持续更新中,QQ群:593177274,欢迎大家加入讨论。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏哲学驱动设计

asp.net MVC 应用程序的生命周期

  首先我们知道http是一种无状态的请求,他的生命周期就是从客户端浏览器发出请求开始,到得到响应结束。那么MVC应用程序从发出请求到获得响应,都做了些什么呢?

551
来自专栏java架构学习交流

Hibernate(或其它ORM)里的inverse用法详解,内容摘自Java web轻量级开发面试教程

    本文来是从 java web轻量级开发面试教程从摘录的。     Inverse的英文含义是反转,在Hibernate中用来决定是由哪方来维护两个业务实...

1925
来自专栏哲学驱动设计

asp.net MVC 应用程序的生命周期

  首先我们知道http是一种无状态的请求,他的生命周期就是从客户端浏览器发出请求开始,到得到响应结束。那么MVC应用程序从发出请求到获得响应,都做了些什么呢?

803
来自专栏丑胖侠

《Drools7.0.0.Final规则引擎教程》番外实例篇——获取规则名称和包名

场景 在QQ(593177274)交流群中,有朋友问到这样一个问题,如果我执行了很多规则,调用fireAllRules方法只会返回触发了几条规则,那么我怎么知道...

19610
来自专栏Linyb极客之路

工作流引擎之activiti利用juel进行条件分支判断

有接触过activiti的小伙伴们,可能会知道activiti可以利用网关来达到分支流转,但是对于一些业务员来说,跟他们说啥是网关,他们可能会一脸懵逼,尤其ac...

1996
来自专栏tkokof 的技术,小趣及杂念

iTween 那些事儿(一)

  工作中用了不少时间的iTween,自己算是有些小小心得,在此随便写写,算作总结吧 :)

372
来自专栏一名合格java开发的自我修养

提取jedis源码的一致性hash代码作为通用工具类

一致性Hash算法是来解决热点问题,如果虚拟节点设置过小热点问题仍旧存在。 关于一致性Hash算法的原理我就不说了,网上有很多人提供自己编写的一致性Hash算...

713
来自专栏牛肉圆粉不加葱

【源码剖析】- Spark 新旧内存管理方案(下)

上一篇文章【源码剖析】- Spark 新旧内存管理方案(上)介绍了旧的内存管理方案以及其实现类 StaticMemoryManager 是如何工作的,本文将通过...

542
来自专栏偏前端工程师的驿站

实现滑动分页(微博分页方式)

  现在大家都在上微博,而微博的滑动分页引起了我的兴趣,于是自己模仿着做,以下是这段时间的成果(单纯实现,没有考虑到效率和其他细节问题)   实现内容:以30条...

1729
来自专栏haifeiWu与他朋友们的专栏

造个轮子之基于 Netty 实现自己的 RPC 框架

服务端开发都会或多或少的涉及到 RPC 的使用,当然如果止步于会用,对自己的成长很是不利,所以楼主今天本着知其然,且知其所以然的精神来探讨一下 RPC 这个东西...

1173

扫码关注云+社区