实现定时任务,包括修改执行策略,用quartz+Spring

本文介绍了一个使用Quartz实现动态调度任务的例子,包括Action类、Bean类和服务类的具体实现方式。通过从数据库获取定时任务表达式并更新现有任务,实现任务的动态调整。
来源于网络 http://www.blogjava.net/xiaodaoxiaodao/articles/103437.html 给出完整的类和配置文件,除了一般是Spring 包外,另外需要下一个包spring-context-1.15.jar包,可在http://repo1.maven.org/maven2/ 找。 下面的内容拼到一个webProject里面,发布起来就可以看到效果。 1.Action public class ScheduleInfoAction { public void reScheduleJob() throws SchedulerException, ParseException { // 运行时可通过动态注入的scheduler得到trigger CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger( "cronTrigger", Scheduler.DEFAULT_GROUP); String dbCronExpression = getCronExpressionFromDB(); String originConExpression = trigger.getCronExpression(); // 判断从DB中取得的任务时间(dbCronExpression)和现在的quartz线程中的任务时间(originConExpression)是否相等 // 如果相等,则表示用户并没有重新设定数据库中的任务时间,这种情况不需要重新rescheduleJob if(!originConExpression.equalsIgnoreCase(dbCronExpression)){ trigger.setCronExpression(dbCronExpression); //执行更新操作 scheduler.rescheduleJob("cronTrigger", Scheduler.DEFAULT_GROUP, trigger); } // 下面是具体的job内容,可自行设置 executeJobDetail(); } private String getCronExpressionFromDB(){ String sql="from ScheduleInfo scheduleInfo where 1=1 "; sql=sql+" and scheduleInfo.infoId = '"+"1" + "'"; List scheduleList = scheduleInfoManager.queryScheduleInListBySql(sql); ScheduleInfo scheduleInfo = (ScheduleInfo)scheduleList.get(0); String dbCronExpression = scheduleInfo.getCronExpression(); return dbCronExpression; } private void executeJobDetail(){ System.out.println("schedule action time:"+System.currentTimeMillis()); } private Scheduler scheduler; // 设值注入,通过setter方法传入被调用者的实例scheduler public void setScheduler(Scheduler scheduler) { this.scheduler = scheduler; } private ScheduleInfoManager scheduleInfoManager; // 设值注入,通过setter方法传入被调用者的实例scheduleInfoManager public void setScheduleInfoManager(ScheduleInfoManager scheduleInfoManager){ this.scheduleInfoManager = scheduleInfoManager; } } 2.Bean public class ScheduleInfo { String cronExpression="0/10 * * * * ?"; public void setCronExpression(String cronExpression) { this.cronExpression = cronExpression; } public String getCronExpression(){ return this.cronExpression ; } } 3.Service public class ScheduleInfoManager { long i =System.currentTimeMillis(); int j=0; List lis=new ArrayList(); ScheduleInfo s=new ScheduleInfo(); public List queryScheduleInListBySql(String sql){ if(System.currentTimeMillis()-i<30*1000 ){ }else if(j==0){ j++; s.setCronExpression("0 * * * * ?"); System.out.println("30秒到,更新参数:0 * * * * ?"); } lis.add(s); return lis; } } 4.Init public class InitializingCronTrigger extends CronTriggerBean implements Serializable { private ScheduleInfoManager scheduleInfoManager; // 设值注入,通过setter方法传入被调用者的实例scheduleInfoManager public void setScheduleInfoManager(ScheduleInfoManager scheduleInfoManager){ this.scheduleInfoManager = scheduleInfoManager; // 因为在getCronExpressionFromDB使用到了scheduleInfoManager,所以 // 必须上一行代码设置scheduleInfoManager后进行getCronExpressionFromDB String cronExpression = getCronExpressionFromDB (); // ① // 因为extendsCronTriggerBean ,此处调用父类方法初始化cronExpression try { setCronExpression (cronExpression); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } // ② } private String getCronExpressionFromDB(){ String sql="from ScheduleInfo scheduleInfo where 1=1 "; sql=sql+" and scheduleInfo.infoId = '"+"1" + "'"; List scheduleList = scheduleInfoManager.queryScheduleInListBySql(sql); ScheduleInfo scheduleInfo = (ScheduleInfo)scheduleList.get(0); String dbCronExpression = scheduleInfo.getCronExpression(); System.out.println("inital:"+dbCronExpression); return dbCronExpression; } 5.applicationcontext.xml
### 易语言单线程实现任务运行、掉线监控、切换定时任务和限时任务的功能 以下是一个基于易语言的单线程框架示例,该框架实现任务运行、掉线监控、切换定时任务和限时任务的功能。通过主循环和延时机制模拟多任务处理效果。 #### 框架设计说明 1. **任务运行**:在主循环中执行用户定义的任务逻辑。 2. **掉线监控**:通过检测网络状态或心跳包来判断是否掉线[^1]。 3. **切换定时任务**:通过不同的时间间隔触发不同的定时任务。 4. **限时任务**:设置任务执行时间限制,并在超时后自动终止任务。 #### 代码实现 ```易语言 .版本 2 .支持库 core .局部变量 开始时间, 整数型 .局部变量 当前时间, 整数型 .局部变量 定时任务类型, 整数型 .局部变量 限时任务开始时间, 整数型 .局部变量 限时任务超时时间, 整数型 .局部变量 掉线状态, 逻辑型 ' 初始化变量 定时任务类型 = 1 限时任务超时时间 = 10000 ' 限时任务超时时间为10秒 掉线状态 = 假 ' 主循环 开始时间 = 取系统时间() 限时任务开始时间 = 取系统时间() .判断循环首 (真) ' 掉线监控 .如果 (检测掉线 ()) 掉线状态 = 真 调试输出 (“检测到掉线!”) .否则 掉线状态 = 假 .结束如果 ' 执行任务运行逻辑 调试输出 (“正在运行任务...”) ' 切换定时任务 当前时间 = 取系统时间() .选择结构 定时任务类型 .情况 1 .如果 (当前时间 - 开始时间 > 5000) ' 定时任务1间隔为5秒 调试输出 (“定时任务1已触发!”) 定时任务类型 = 2 开始时间 = 当前时间 .结束如果 .情况 2 .如果 (当前时间 - 开始时间 > 10000) ' 定时任务2间隔为10秒 调试输出 (“定时任务2已触发!”) 定时任务类型 = 1 开始时间 = 当前时间 .结束如果 .结束选择结构 ' 限时任务监控 .如果 (取系统时间 () - 限时任务开始时间 > 限时任务超时时间) 调试输出 (“限时任务已超时,自动终止!”) 限时任务开始时间 = 取系统时间() ' 重置限时任务开始时间 .否则 调试输出 (“限时任务正在运行...”) .结束如果 ' 模拟任务处理延时 延时 (100) ' 减少CPU占用率 .判断循环尾 () ' 掉线检测函数 .子程序 检测掉线, 逻辑型 ' 模拟网络状态检测 返回 (随机数 (1, 100) > 95) ' 有5%的概率检测到掉线 .子程序 ``` #### 设计细节 1. **任务运行**:在主循环中,持续执行任务逻辑。此部分可以根据实际需求扩展为复杂的业务逻辑[^2]。 2. **掉线监控**:通过 `检测掉线` 函数模拟网络状态检测。如果检测到掉线,则设置 `掉线状态` 为真[^3]。 3. **切换定时任务**:通过不同的时间间隔触发不同的定时任务。每次触发后切换定时任务类型并重置时间计数器。 4. **限时任务**:设置任务执行时间限制,并在超时后自动终止任务。通过检测当前时间和任务开始时间的差值判断是否超时[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值