《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)。

后语

此系列课程持续更新中,QQ群:593177274,欢迎大家加入讨论。由于Drools资料较少,教程编写不易,每篇博客都亲身实践编写demo。如果对你有帮助也欢迎赞赏! 也是对原创的最大支持!

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏飞扬的花生

Html5上传插件封装

      前段时间将flash的上传控件替换成使用纯js实现的,在此记录 1.创建标签 <div class="camera-area" style="dis...

3398
来自专栏Java成神之路

极光推送_总结_01_Java实现极光推送

1313
来自专栏林德熙的博客

C# Task.Run 和 Task.Factory.StartNew 区别 创建新线程等待线程长时间运行

有小伙伴问我,为什么不推荐他使用 Task.Factory.StartNew ,因为 Task.Run 是比较新的方法。 本文告诉大家 Task.Run 和 T...

1431
来自专栏菩提树下的杨过

msmq发送速度的测试

在一些并发量比较高的"中小型"应用中,如果短期内有大量的数据插入,利用msmq中转是一个不错的选择(petshop就是这么干的),想知道msmq一秒钟内到底能...

2289
来自专栏跟着阿笨一起玩NET

ASP.NET多线程下使用HttpContext.Current为null解决方案

前面我还提到在APM模式下的异步完成回调时,访问HttpContext.Current也会返回null,那么此时该怎么办呢?

1592
来自专栏游戏杂谈

Unity项目中文字的统一管理

一款游戏在研发初期就需要考虑多语言的问题,否则后期在进行多国语言版本时就面临着巨大的成本。鉴于之前页游的经验,其它同事设计出读取Excel的方式来管理所有的文字...

1191
来自专栏Porschev[钟慰]的专栏

前台JS(Jquery)调用后台方法 无刷新级联菜单示例

前台用AJAX直接调用后台方法,老有人发帖提问,没事做个示例 CasMenu.aspx页面: <%@ Page Language="C#" AutoEventW...

3125
来自专栏博客园

Asp.Net Web API(六)

     Asp.Net Web API不可以需要IIS。可以自己在主机上承载一个Web API

1294
来自专栏我和未来有约会

CaseStudy(showcase)数据篇-从XML中获取数据

做silvelight也有一段时间了,相册、游戏,刚刚完成的showcase这个小程序算是一个阶段了。这里就以showcase这个项目来做一下CaseStudy...

1968
来自专栏菩提树下的杨过

asp.net与asp的session共享 及 asp的请求拦截

asp.net 与 asp 的session是无法直接共享的(底层的处理dll也不一样),要想互通session,只能用变通的办法: 一、asp.net -> ...

2527

扫码关注云+社区

领取腾讯云代金券