zoukankan      html  css  js  c++  java
  • 【java规则引擎】《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>
    View Code

    实现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;
        }
    
    }
    View Code

    规则文件:

    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
    View Code

    测试方法:

    @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;
     }
    View Code

    执行测试方法打印结果:

    In rule - calenderTest
    String matched Hello
    Bye
    View Code

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

  • 相关阅读:
    【转】mybatis 获取自增id
    【转】Spring注解@Component、@Repository、@Service、@Controller区别
    【转】使用spring @Scheduled注解执行定时任务
    eclipse/myeclipse选中编辑区域文件,Package Explorer定位文件所在项目及目录
    [转]基于Spring + Spring MVC + Mybatis 高性能web构建
    servlet跳转jsp
    【转】PHP cookie禁用时session 方案
    【转】RESTful API 设计最佳实践
    【转】验证HTTP Referer字段
    【转】Javascript:谈谈JS的全局变量跟局部变量
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/9439335.html
Copyright © 2011-2022 走看看