《Drools7.0.0.Final规则引擎教程》日历详解编程语言

日历

日历可以单独应用于规则中,也可以和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中哪一天执行,哪一天不执行。

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/15200.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论