《Drools7.0.0.Final规则引擎教程》第4章 4.3 日历

简介: 《Drools7.0.0.Final规则引擎教程》第4章 4.3 日历

日历

日历可以单独应用于规则中,也可以和timer结合使用在规则中使用。通过属性calendars来定义日历。如果是多个日历,则不同日历之间用逗号进行分割。


在Drools中,日历的概念只是将日历属性所选择的时间映射成布尔值,设置为规则的属性,控制规则的触发。Drools可以通过计算当期日期和时间来决定是否允许规则的触发。

此示例首先需要引入quarts框架:


<dependency>
    <groupId>org.opensymphony.quartz</groupId>
    <artifactId>quartz</artifactId>
    <version>1.6.1</version>
</dependency>

实现Quarts的Calendar转换为Drools的Calendar的转换器CalendarWrapper:

public class CalendarWrapper implements Calendar{
    private WeeklyCalendar cal;
    public CalendarWrapper(WeeklyCalendar cal) {
        this.cal = cal;
    }
    @Override
    public boolean isTimeIncluded(long timestamp) {
        return cal.isTimeIncluded(timestamp);
    }
    public WeeklyCalendar getCal() {
        return cal;
    }
    public void setCal(WeeklyCalendar cal) {
        this.cal = cal;
    }
}

规则文件:

package com.rules
rule "calenderTest"
    calendars "weekday"
//    timer (int:0 1s) // 可以和timer配合使用
    when
        str : String();
    then
        System.out.println("In rule - " + drools.getRule().getName());
        System.out.println("String matched " + str);
    end

测试方法:

@Test
    public void timerTest() throws InterruptedException {
        final KieSession kieSession = createKnowledgeSession();
        WeeklyCalendar weekDayCal = new WeeklyCalendar();
        // 默认包含所有的日期都生效
        weekDayCal.setDaysExcluded(new boolean[]{false, false, false, false, false, false, false,false,false});
//        weekDayCal.setDayExcluded(java.util.Calendar.THURSDAY, true); // 设置为true则不包含此天,周四
        Calendar calendar = new CalendarWrapper(weekDayCal);
        kieSession.getCalendars().set("weekday", calendar);
        kieSession.insert(new String("Hello"));
        kieSession.fireAllRules();
        kieSession.dispose();
        System.out.println("Bye");
}
protected KieSession createKnowledgeSession() {
        KieServices kieServices = KieServices.Factory.get();
        KieSessionConfiguration conf = kieServices.newKieSessionConfiguration();
        KieContainer kieContainer = kieServices.getKieClasspathContainer();
        KieSession kSession = kieContainer.newKieSession("ksession-rule", conf);
        return kSession;
 }

执行测试方法打印结果:


In rule - calenderTest

String matched Hello

Bye


其中测试过程中的注意点已经在代码中进行标注,比如Calendar可以和timer共同使用;如何设置WeeklyCalendar中哪一天执行,哪一天不执行。


PS:完整demo下载或加QQ群,进入文件目录下载(包含其他更多场景demo)。



目录
相关文章
|
Java Maven Docker
Docker部署可执行jar包
Docker部署可执行jar包
6170 0
|
存储 Unix Linux
手写操作系统(4)——计算机是如何启动的?BIOS、GRUB、文件系统......
手写操作系统(4)——计算机是如何启动的?BIOS、GRUB、文件系统......
483 1
|
API Python
全面拥抱FastApi — 蓝图APIRouter
全面拥抱FastApi — 蓝图APIRouter
|
编译器 测试技术 计算机视觉
红黑树模拟封装map和set
红黑树模拟封装map和set
netty的异常分析 IllegalReferenceCountException refCnt: 0, decrement: 1
netty的异常分析 IllegalReferenceCountException refCnt: 0, decrement: 1
615 0
|
Java
手把手教你如何掌握多态,解锁Java编程的更高境界
手把手教你如何掌握多态,解锁Java编程的更高境界
91 4
|
JavaScript 前端开发 开发者
Vue的响应式原理:深入探索Vue的响应式系统与依赖追踪
【4月更文挑战第24天】Vue的响应式原理通过JavaScript getter/setter实现,当数据变化时自动更新视图。它创建Watcher对象收集依赖,并通过依赖追踪机制精确通知更新。当属性改变,setter触发更新相关Watcher,重新执行操作以反映数据最新状态。Vue的响应式系统结合依赖追踪,有效提高性能,简化复杂应用的开发,但对某些复杂数据结构需额外处理。
|
消息中间件 Kafka 数据处理
了解Kafka位移自动提交的秘密:避免常见陷阱的方法
了解Kafka位移自动提交的秘密:避免常见陷阱的方法
1040 1
|
存储 机器学习/深度学习 分布式计算
基于PAI-EAS挂载OSS部署AIGC服务
本场景中主要介绍如何使用模型在线服务(PAI-EAS)部署AIGC,例如Diffusion文图生成模型,并利用OSS挂载功能,使用户无需担心因为PAI服务停止或删除导致数据丢失的问题,充分解决AI服务持久化存储与扩容需求。
基于PAI-EAS挂载OSS部署AIGC服务
|
SQL 分布式计算 关系型数据库
【数据采集与预处理】数据传输工具Sqoop
【数据采集与预处理】数据传输工具Sqoop

热门文章

最新文章