《Drools7.0.0.Final规则引擎教程》第4章 4.3 定时器
来源:互联网 发布:2017农村淘宝 编辑:程序博客网 时间:2024/06/05 15:08
定时器
规则用基于 interval(间隔)和cron的定时器(timer),替代了被标注过时的duration
属性。timer属性的使用示例:
timer ( int: <initial delay> <repeat interval>? )timer ( int: 30s )timer ( int: 30s 5m )timer ( cron: <cron expression> )timer ( cron:* 0/15 * * * ? )
间隔定时器用int来定义,它遵循java.util.Timer对象的使用方法。具有延迟和重复执行的选择。其中第一个参数表示启动之后延迟多长时间执行,第二个参数表示每隔多久执行一次。
Cron定时器用cron来定义,使用标准的Unix 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
上面代码实现了每隔15分钟发送一封邮件的部分规则代码。
下面以一个模拟的系统报警器来示例一下Timer的使用。规则timer每隔一秒执行一次,当满足触发规则返回结果至ResultEvent对象中,业务系统拿到报警信息,并打印。为了达到模拟的效果,使用了KieSession的fireUntilHalt方法和halt方法。示例代码如下。
规则文件:
package com.rulesimport java.util.Dateimport java.util.Listimport com.secbro.drools.testTimer.Serverglobal com.secbro.drools.testTimer.ResultEvent eventrule "timerTest" timer (cron:0/1 * * * * ?) when server : Server(times > 10) then System.out.println("已经尝试"+server.getTimes()+"次,超过预警次数!"); event.getEvents().add(new java.util.Date() + " - 服务器已经尝试" + server.getTimes() + "次,依旧失败,特发次报警信息!");end
Server类:
package com.secbro.drools.testTimer;/** * Created by zhuzs on 2017/7/21. */public class Server { // 尝试次数 private int times; Server(int times) { this.times = times; }//省略getter/setter方法}
返回结果ResultEvent类:
package com.secbro.drools.testTimer;import java.util.ArrayList;import java.util.List;/** * Created by zhuzs on 2017/7/21. */public class ResultEvent { private List<String> events = new ArrayList<>();//省略getter/setter方法 }
测试类:
package com.secbro.drools.testTimer;import org.junit.Test;import org.kie.api.KieServices;import org.kie.api.runtime.KieContainer;import org.kie.api.runtime.KieSession;import org.kie.api.runtime.rule.FactHandle;/** * Created by zhuzs on 2017/7/21. */public class TimerRulesTest { @Test public void timerTest() throws InterruptedException { final KieSession kieSession = createKnowledgeSession(); ResultEvent event = new ResultEvent(); kieSession.setGlobal("event", event); final Server server = new Server(1); new Thread(new Runnable() { public void run() { kieSession.fireUntilHalt(); } }).start(); FactHandle serverHandle = kieSession.insert(server); for (int i = 8; i <= 15; i++) { Thread.sleep(2000); server.setTimes(++i); kieSession.update(serverHandle, server); } Thread.sleep(3000); kieSession.halt(); System.out.println(event.getEvents()); } private KieSession createKnowledgeSession() { KieServices kieServices = KieServices.Factory.get(); KieContainer kieContainer = kieServices.getKieClasspathContainer(); KieSession kSession = kieContainer.newKieSession("ksession-rule"); return kSession; }}
kmodule.xml文件:
<?xml version="1.0" encoding="UTF-8"?><kmodule xmlns="http://www.drools.org/xsd/kmodule"> <kbase name="rules" packages="com.rules"> <ksession name="ksession-rule"/> </kbase></kmodule>
控制台打印:
已经尝试11次,超过预警次数!已经尝试11次,超过预警次数!已经尝试13次,超过预警次数!已经尝试13次,超过预警次数!已经尝试15次,超过预警次数!已经尝试15次,超过预警次数!已经尝试15次,超过预警次数![Fri Jul 21 21:04:11 CST 2017 - 服务器已经尝试11次,依旧失败,特发次报警信息!, Fri Jul 21 21:04:12 CST 2017 - 服务器已经尝试11次,依旧失败,特发次报警信息!, Fri Jul 21 21:04:13 CST 2017 - 服务器已经尝试13次,依旧失败,特发次报警信息!, Fri Jul 21 21:04:14 CST 2017 - 服务器已经尝试13次,依旧失败,特发次报警信息!, Fri Jul 21 21:04:15 CST 2017 - 服务器已经尝试15次,依旧失败,特发次报警信息!, Fri Jul 21 21:04:16 CST 2017 - 服务器已经尝试15次,依旧失败,特发次报警信息!, Fri Jul 21 21:04:17 CST 2017 - 服务器已经尝试15次,依旧失败,特发次报警信息!]
很显然,定时器每隔一秒执行一次,当满足规则触发条件时,将结果放入ResultEvent中。
PS:完整demo下载请加QQ群,进入文件目录下载(包含其他更多场景demo)。
后语
你的支持是我努力的最大动力!社区的建立离不开你的支持。此系列课程正在持续更新中,相关讨论QQ(593177274)已经建立,欢迎大家加入讨论。如有疑问可以留言也可以发送本人邮箱secbro2@gmail.com。击此处关注Drools博客专栏的持续更新《Drools博客专栏》
阅读全文
2 0
- 《Drools7.0.0.Final规则引擎教程》第4章 4.3 定时器
- 《Drools7.0.0.Final规则引擎教程》第4章 4.3 日历
- 《Drools7.0.0.Final规则引擎教程》第4章 4.1 规则文件
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 lock-on-active
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 ruleflow-group&salience
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 agenda-group
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 auto-focus
- 《Drools7.0.0.Final规则引擎教程》第4章 4.2 activation-group& dialect& date-effective
- 《Drools7.0.0.Final规则引擎教程》第4章 4.4 LHS简介&Pattern
- 《Drools7.0.0.Final规则引擎教程》第4章 4.4 约束(Pattern的一部分)
- 《Drools7.0.0.Final规则引擎教程》第4章 4.5RHS语法
- 《Drools7.0.0.Final规则引擎教程》第4章 4.6 结果条件
- 《Drools7.0.0.Final规则引擎教程》第4章 注释&错误信息
- 《Drools7.0.0.Final规则引擎教程》第4章 4.9 关键字
- 《Drools7.0.0.Final规则引擎教程》第4章 global全局变量
- 《Drools7.0.0.Final规则引擎教程》第4章 Query查询之基础
- 《Drools7.0.0.Final规则引擎教程》第4章 Function函数
- 括号匹配 栈的应用
- hdu 1556 Color the ball (树状数组)
- Android笔记(21)网络加载圆形图片
- Java -- BigDecimal类
- Android中SQLite的数据库版本升级详解
- 《Drools7.0.0.Final规则引擎教程》第4章 4.3 定时器
- flume简介与安装配置
- spring学习之---创建Bean的三种方式
- 爬图片URL
- Java实现冒泡排序算法
- 关于Java内部类的理解
- PHP正则表达式常用的5种模式修正符
- 方法分派
- RH124-第六节-文件权限