`
cuker919
  • 浏览: 88568 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

动态改变Quartz的调度时间

 
阅读更多

最近几天项目里的定时器常常发生异常,比如:

1、修改linux系统时间时,定时任务全挂掉不动了。

2、在页面里面动态修改任务时间,常常不执行了。

下面是一些网友的资料,暂时收集放着,有时间将去验证和修改自己系统的问题。



近日碰到一位友人提出的一个问题,如何动态的改变Quartz的调度作业的时间。比如,由每10分钟执行一次改为每5分钟执行一次。个人认为这种需求应该 通过某种方式来规避,或者选用其他的技术框架,因为动态改变Quartz的调度时间完全失去了使用Quartz的意义。本人在使用Quartz是基于 Spring来配置的,而朋友的项目中不能使用SPring框架,这就需要直接基于Quartz编程。工作之余,写了个例子:
Quartz的管理类

Java代码 收藏代码
  1. public class QuartzManage{
  2. private static SchedulerFactorysf= new StdSchedulerFactory();
  3. private static StringJOB_GROUP_NAME= "group" ;
  4. private static StringTRIGGER_GROUP_NAME= "trigger" ;
  5. public static void startJob(StringjobName,Jobjob,Stringtime)
  6. throws SchedulerException,ParseException{
  7. Schedulersched=sf.getScheduler();
  8. JobDetailjobDetail=new JobDetail();
  9. jobDetail.setName(jobName);
  10. jobDetail.setGroup(JOB_GROUP_NAME);
  11. jobDetail.setJobClass(job.getClass());
  12. CronTriggertrigger=new CronTrigger(jobName,TRIGGER_GROUP_NAME);
  13. trigger.setCronExpression(time);
  14. sched.scheduleJob(jobDetail,trigger);
  15. if (!sched.isShutdown()){
  16. sched.start();
  17. }
  18. }
  19. /**
  20. *从Scheduler移除当前的Job,修改Trigger
  21. *
  22. *@paramjobDetail
  23. *@paramtime
  24. *@throwsSchedulerException
  25. *@throwsParseException
  26. */
  27. public static void modifyJobTime(JobDetailjobDetail,Stringtime)
  28. throws SchedulerException,ParseException{
  29. Schedulersched=sf.getScheduler();
  30. Triggertrigger=sched.getTrigger(jobDetail.getName(),
  31. TRIGGER_GROUP_NAME);
  32. if (trigger!= null ){
  33. CronTriggerct=(CronTrigger)trigger;
  34. //移除当前进程的Job
  35. sched.deleteJob(jobDetail.getName(),jobDetail.getGroup());
  36. //修改Trigger
  37. ct.setCronExpression(time);
  38. System.out.println("CronTriggergetName" +ct.getJobName());
  39. //重新调度jobDetail
  40. sched.scheduleJob(jobDetail,ct);
  41. }
  42. }
  43. }


Job任务:

Java代码 收藏代码
  1. public class JobTest implements Job{
  2. static int a= 0 ;
  3. @Override
  4. public void execute(JobExecutionContextcontext)
  5. throws JobExecutionException{
  6. a+=1 ;
  7. System.out.println("test++++++++++++++++++++++a=" +a);
  8. if (a== 4 ){
  9. try {
  10. QuartzManage.modifyJobTime(context.getJobDetail(),
  11. "0/10****?" );
  12. }catch (SchedulerExceptione){
  13. e.printStackTrace();
  14. }catch (ParseExceptione){
  15. e.printStackTrace();
  16. }
  17. }
  18. }
  19. }


启动线程执行调度:

Java代码 收藏代码
  1. public class QuartzTest{
  2. public static void main(String[]args) throws SchedulerException,
  3. ParseException{
  4. /*
  5. *此进程为主进程,触发了quartz对Job的调度因此启动Job之后,在该进程修改调度,是没有效果的
  6. */
  7. JobTestjob=new JobTest();
  8. QuartzManage.startJob("ming" ,job, "0/2****?" );
  9. }
  10. }



好多人的思路是在启动的主线程内去改变调度的时间,简单的分析就可发现,主线程启动之后就会按照调度时间去运行Job,不会返回主线程再去加载调度时间,只是起到了触发调度的操作。因此要进行动态的修改调度时间,需要在Job任务里,动态改变当前线程的调度计划。

测试代码,开始时按每2秒执行一次打印a,当a打印4次以后,按照每10秒一次执行。虽然代码测试成功,本人还有疑惑。

Java代码 收藏代码
  1. //移除当前进程的Job
  2. sched.deleteJob(jobDetail.getName(),jobDetail.getGroup());


先移除当前的Job任务,在按照新的调度时间加入新的Job,虽然可以实现动态的改变,不知道是否带来了其他的问题。
欢迎大家批评指正共同测试、验证!

分享到:
评论

相关推荐

    spring mvc quartz 动态设置时间

    spring mvc quartz 动态设置时间,可以实现任务调度的暂停和重启,在页面实现一个功能,可以动态设置调度的表达式,可以开启暂停任务调度

    Quartz动态修改时间,java实现修改CronExpression方法

    下载导入就可以用,执行test类的main方法加载spring applicationContext.xml配置文件,启动Quartz定时器.修改spring配置文件的配置时间.详细看注释

    Java中使用Quartz进行任务调度常用操作

    包含Java中使用Quartz进行任务调度常用操作:设置开始时间、设置结束时间、简单触发器、Cron触发器、作业监听器、启动多个作业、查看所有作业、手动触发作业、传递参数、取消/删除作业、作业出错时自动再执行等代码...

    (动态多)定时任务源码自动运行调度后台执行

    1、spring 定时任务demo ...9、spring+quartz动态定时任务创建 +mybatis(包含quartz动态定时任务的) 10、C#实现的自定义定时任务 可定时运行 多任务运行 11、ETL定时任务(数据同步)(没有数据库,仅供参

    akka-quartz-scheduler:Quartz扩展和实用程序,用于Akka中的cron式调度

    阿卡石英计 Quartz扩展和实用程序,可... 这里的目标是为Akka提供一个调度系统,该调度系统与人们对Cron型作业的期望更加接近-设置可以长时间运行的ActorSystem,这些事件可以由Quartz启动。 目前尚无任何计划与分布式

    Java 项目中使用单线程 实现 Quartz-2.2.1 触发优先级 源码下载

    该示例将执行以下操作: 用一个工作线程创建一个调度... 安排三个不同优先级的触发器,第一次同时触发,第二次以错开的时间间隔触发; 启动Quartz Scheduler; 等待30秒让 Job 有机会触发触发器; 关闭调度程序;

    spring quartz

    spring quartz 设置定时,可以设置在规定时间内执行任务调度。

    详解免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    计时器具有不灵活的计划(仅能设置开始时间和重复间隔,没有基于日期,时间等);计时器不使用线程池(每个定时器一个线程);计时器没有真正的管理方案 – 你必须编写自己的机制,以便能够记住,组织和检索任务的...

    任务调度,java自动执行

    任务调度,java自动执行 任务调度,自己定义执行时间

    dropwizard-jobs:调度Dropwizard的Quartz集成

    作业在应用程序启动时运行以进行初始设置(也可以通过dropwizard中的托管实例来完成) 在关闭应用程序之前,作业在应用程序停止时运行(也可以通过dropwizard中的托管实例来完成) 在一定时间间隔后重复的作业需要...

    quartz的基本使用,配置job,jobdetail,trigger,Scheduler

    通过CronScheduleBuilder、SimpleScheduleBuilder设置时间规则。

    Spring boot整合Mybatis实现增删改查

    Spring boot,Mybatis的整合总是很麻烦,在此提供一个已经整合好三大框架的包,可以直接下载导入Myeclipse使用,项目基于Maven做依赖管理。...@Scheduled是单线程的,每次最多只有一个作业在运行,如果调度时间到了作

    Java源码 SpringMVC Mybatis Shiro Bootstrap Rest Webservice

    集成Quartz调度,可以用作定时调度平台(动态配置调度类、调度时间,使程序自动执行某些业务) 6. Lucene搜索引擎,可以将文件资料索引化,支持文件内容搜索、关键字搜索、高亮关键字等,使信息在毫秒内提取查询...

    java版oa源码下载-S2SH:Struts2,Hibernate,Spring三大框架的整合

    java版oa源码下载 S2SH Struts2,Hibernate,Spring三大框架的整合总是...5.集成了作业自动调度框架Quartz 2.2.2实现作业调度; 6.json插件使用Struts2自带的json插件; 7.包含了一个文件上传的功能和数据表导出为Excel下

    万能后台管理模板javaweb

    26. 备份定时器:quartz 2.2 强大的任务调度,多线程备份数据库,任务启动关闭异步操作 27. 数据库还原:历史备份记录,还原数据库 or 单表 ,统计备份时间和文件大小 28. SQL编辑器:强大的SQL编辑器,支持编辑语句...

    javaOA办公系统模块设计方案.pdf

    备份定时器:quartz 强⼤的任务调度,多线程备份数据库,任务启动关闭异步操作 21. 数据库还原:历史备份记录,还原数据库 or 单表(sqlserver不⽀持),统计备份时间和⽂件⼤⼩ 22. SQL编辑器:强⼤的SQL编辑器,⽀...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    搜索引擎技术:Lucene.Net、多线程开发、爬虫技术、网页分析、正则表达式、Log4Net日志框架、Quartz.Net定时作业调度。 大型互联网开发技术:代码生成、网页静态化、基于JQuery的Web2.0页面开发、AJAX、SEO、网站...

    J2eeFAST企业级快速开发平台 v2.0.8

    更新时间: 2020-08-11 资源类型: 国产软件 推荐等级: ★★★☆☆ 平台环境: JAVA/Mysql 作者主页: 点击查看 演示地址: 点击查看 详细介绍 – [ J2eeFAST企业级快速开发平台 v2.0.8 ] J2eeFAST 是一个Java EE...

Global site tag (gtag.js) - Google Analytics