定时器
规则现在支持基于 interval(间隔)和 cron 的定时器,
替代了过时的 duration(期限) 属性。
简单的定时器属性使用
第一种写法
timer ( int: <initial delay> <repeat interval>? )
timer ( int: 30s )
timer ( int: 30s 5m )
第二种写法
timer ( cron: <cron expression> )
timer ( cron:* 0/15 * * * ? )
Interval "int:" 定时器遵守 JDK 语义,初始化延迟,紧跟一个可选的重复间隔。Cron "cron:"定时器遵
守标准的 cron 表达式:
一个 Cron 例子
rule "Send SMS every 15 minutes"
timer (cron:* 0/15 * * * ?)
when
$a : Alarm( on == true )
then
channels[ "sms" ].insert( new Sms( $a.mobileNumber, "The alarm is still on" );
end
调节一个 Quartz 日历
Calendar weekDayCal = QuartzHelper.quartzCalendarAdapter(org.quartz.Cale
ndar quartzCal)
利用有
状态知识会话注册日历:
ksession.getCalendars().set( "week day", weekDayCal );
它们可同时使用于普通规则和包含定时器的规则中。 规则的 calendar 属性可以有一个或多个逗号日历
名字:
一起使用日历和定时器:
rule "weekdays are high priority"
calendars "weekday"
timer (int:0 1h)
when
Alarm()
then
send( "priority high - we have an alarm );
end
rule "weekend are low priority"
calendars "weekend"
timer (int:0 4h)
when
Alarm()
then
send( "priority low - we have an alarm );
end
在6.4版本中,定时器的调用方法不是简单的通过
fireAllRules
进行调用的,而是另有其他用法,下面我们就简单的说明一下。
我们点击到fireAllRules中可以看到 里面有两种方法,用的是是重载的方式。我们先简单的的说明一下关于定时器的使用:
fireUntilHalt() 方
法fireUntilHalt(
final
AgendaFilter
agendaFilter)
源码中给定的说明是
通过一个简单的例子来说明一下
DRL文件 内容如下:
package rules.testdrl;
rule "timer"
timer ( int: 10s )
when
eval(true);
then
System.out.println("用来测试 timer");
end
JAVA使用代码如下:
package com.drools.api.grammar;
import com.drools.model.TestPersonSet;
import com.drools.model.TestTemplate01;
import org.drools.template.ObjectDataCompiler;
import org.junit.Test;
import org.kie.api.io.Resource;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;
import org.kie.internal.utils.KieHelper;
import java.util.ArrayList;
import java.util.Collection;
/**
* Created by kangz on 2016/9/7.
*/
public class TimerTest {
@Test
public void timerTest () throws Exception {
Resource dis = ResourceFactory.newClassPathResource("rules/testdrl/TimerTest.drl", TestTemplate01.class);
ObjectDataCompiler converter = new ObjectDataCompiler();
Collection<TestPersonSet> cfl = new ArrayList<TestPersonSet>();
KieHelper helper = new KieHelper();
helper.addResource(dis, ResourceType.DRL);
KieSession ksession = helper.build().newKieSession();
ksession.fireUntilHalt();
ksession.dispose();
}
}
通过上面的例子,我们可以得到 输出的结果。如果按之前的
fireAllRules 写法虽然不会报错,但不会执行规则。
至于第二个方法。
fireUntilHalt(
final
AgendaFilter
agendaFilter)我也做一个简单说明,其实这个方法理解起来很简单,就是指定规则名。那如何才能正确的理解这个指定规则名呢,请到
Drools调用API篇之fireAllRules的使用指定规则名说明 这一章节中了解
下面是小编的微信转帐二维码,小编再次谢谢读者的支持,小编会更努力的
----请看下方↓↓↓↓↓↓↓
百度搜索 Drools从入门到精通:可下载开源全套Drools教程
深度Drools教程不段更新中:
更多Drools实战陆续发布中………
扫描下方二维码关注公众号 ↓↓↓↓↓↓↓↓↓↓