精华内容
下载资源
问答
  • Spring和quartz 动态暂停

    2017-01-19 10:11:23
    Spring 3整合Quartz 2实现定时任务三:动态暂停 恢复 修改和删除任务 前面我们已经完成了spring 3和quartz 2的整合以及动态添加定时任务,我们接着来完善它,使之能支持更多的操作,例如暂停、恢复、修改等。 ...

    Spring 3整合Quartz 2实现定时任务三:动态暂停 恢复 修改和删除任务

    前面我们已经完成了spring 3和quartz 2的整合以及动态添加定时任务,我们接着来完善它,使之能支持更多的操作,例如暂停、恢复、修改等。




    在动态添加定时任务中其实已经涉及到了其中的一些代码,这里我们再来细化的理一理。先来看一下我们初步要实现的目标效果图,这里我们只在内存中操作,并没有把quartz的任何信息保存到数据库,即使用的是RAMJobStore,当然如果你有需要,可以实现成JDBCJobStore,那样任务信息将会更全面,貌似还有专门的监控工具,不过本人没有用过:

    如上图,我们要先列出计划中的定时任务以及正在执行中的定时任务,这里的正在执行中指的是任务已经触发线程还没执行完的情况。比如每天2点执行一个数据导入操作,这个操作执行时间需要5分钟,在这5分钟之内这个任务才是运行中的任务。当任务正常时可以使用暂停按钮,任务暂停时可以使用恢复按钮。

    trigger各状态说明:

    None:Trigger已经完成,且不会在执行,或者找不到该触发器,或者Trigger已经被删除 NORMAL:正常状态 PAUSED:暂停状态 COMPLETE:触发器完成,但是任务可能还正在执行中 BLOCKED:线程阻塞状态 ERROR:出现错误

    计划中的任务

    指那些已经添加到quartz调度器的任务,因为quartz并没有直接提供这样的查询接口,所以我们需要结合JobKey和Trigger来实现,核心代码:

    1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
    2. GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
    3. Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
    4. List<ScheduleJob> jobList = new ArrayList<ScheduleJob>();
    5. for (JobKey jobKey : jobKeys) {
    6. List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
    7. for (Trigger trigger : triggers) {
    8. ScheduleJob job = new ScheduleJob();
    9. job.setJobName(jobKey.getName());
    10. job.setJobGroup(jobKey.getGroup());
    11. job.setDesc("触发器:" + trigger.getKey());
    12. Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
    13. job.setJobStatus(triggerState.name());
    14. if (trigger instanceof CronTrigger) {
    15. CronTrigger cronTrigger = (CronTrigger) trigger;
    16. String cronExpression = cronTrigger.getCronExpression();
    17. job.setCronExpression(cronExpression);
    18. }
    19. jobList.add(job);
    20. }
    21. }

    上面代码中的jobList就是我们需要的计划中的任务列表,需要注意一个job可能会有多个trigger的情况,在下面讲到的立即运行一次任务的时候,会生成一个临时的trigger也会出现在这。这里把一个Job有多个trigger的情况看成是多个任务。我们前面包括在实际项目中一般用到的都是CronTrigger ,所以这里我们着重处理了下CronTrigger的情况。

    运行中的任务

    实现和计划中的任务类似,核心代码:

    1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
    2. List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
    3. List<ScheduleJob> jobList = new ArrayList<ScheduleJob>(executingJobs.size());
    4. for (JobExecutionContext executingJob : executingJobs) {
    5. ScheduleJob job = new ScheduleJob();
    6. JobDetail jobDetail = executingJob.getJobDetail();
    7. JobKey jobKey = jobDetail.getKey();
    8. Trigger trigger = executingJob.getTrigger();
    9. job.setJobName(jobKey.getName());
    10. job.setJobGroup(jobKey.getGroup());
    11. job.setDesc("触发器:" + trigger.getKey());
    12. Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
    13. job.setJobStatus(triggerState.name());
    14. if (trigger instanceof CronTrigger) {
    15. CronTrigger cronTrigger = (CronTrigger) trigger;
    16. String cronExpression = cronTrigger.getCronExpression();
    17. job.setCronExpression(cronExpression);
    18. }
    19. jobList.add(job);
    20. }
    暂停任务

    这个比较简单,核心代码:

    1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
    2. JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
    3. scheduler.pauseJob(jobKey);
    恢复任务

    和暂停任务相对,核心代码:

    1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
    2. JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
    3. scheduler.resumeJob(jobKey);
    删除任务

    删除任务后,所对应的trigger也将被删除

    1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
    2. JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
    3. scheduler.deleteJob(jobKey);
    立即运行任务

    这里的立即运行,只会运行一次,方便测试时用。quartz是通过临时生成一个trigger的方式来实现的,这个trigger将在本次任务运行完成之后自动删除。trigger的key是随机生成的,例如:DEFAULT.MT_4k9fd10jcn9mg。在我的测试中,前面的DEFAULT.MT是固定的,后面部分才随机生成。

    1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
    2. JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
    3. scheduler.triggerJob(jobKey);
    更新任务的时间表达式

    更新之后,任务将立即按新的时间表达式执行:

    1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
    2. TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(),
    3. scheduleJob.getJobGroup());
    4. //获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
    5. CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
    6. //表达式调度构建器
    7. CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob
    8. .getCronExpression());
    9. //按新的cronExpression表达式重新构建trigger
    10. trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
    11. .withSchedule(scheduleBuilder).build();
    12. //按新的trigger重新设置job执行
    13. scheduler.rescheduleJob(triggerKey, trigger);

    到这里,我们的spring3 整合quartz 2的定时任务功能终于是告一段落了,对常用的一些功能进行了实现,相信可以满足一般项目的需求了。

    展开全文
  • Spring Quartz 动态暂停、恢复、修改定时任务的一个demo,使用maven构建,框架采用spring springmvc jpa,数据库mysql,含数据库脚本,运行可用,页面访问地址http://localhost:8080/quartz_demo/quartz/list
  • Spring 3整合Quartz 2实现定时任务三:动态暂停 恢复 修改和删除任务,原http://blog.csdn.net/phantomes/article/details/37880551博客的源码例子
  • Spring 3整合Quartz 1.8实现定时任务三:动态暂停 恢复 修改和删除任务 任务保存到数据库,系统启动时读取数据库,页面显示加载,并管理 注:spring3+quartz2动态任务调度,任务保存在内存中,页面显示动态管理版...
  • 以前是用spring+quartz的方式实现的定时任务:动态暂停 恢复 修改和删除任务。 但是在spring3以后,spring自己的task包,能实现轻量级的定时任务。 项目决定不用quartz,只用spring自带的包,完成这个任务。 我搜索...
  • 【TechWeb 】4月4日,微信派发布公布,从4月4日零时起,微信表情商店、视频动态功能将启动后台服务升级,暂停使用,预计4月6日恢复。其他功能不受影响。 其中,已经下载的表情及系统表情仍可正常使用。 目前,微信...
        

    【TechWeb 】4月4日,微信派发布公布,从4月4日零时起,微信表情商店、视频动态功能将启动后台服务升级,暂停使用,预计4月6日恢复。其他功能不受影响。

    微信表情商店视频动态暂停使用 6日恢复1_副本

    其中,已经下载的表情及系统表情仍可正常使用。

    目前,微信表情商店已经停用。拍摄视频动态时,微信团队会提醒你:视频动态正在升级中,咱不能发表视频。

    微信表情商店视频动态暂停使用 6日恢复2_副本

    微信视频动态是今年1月微信7.0.2版本新上线的功能。在“微信-我”界面,下拉后出现“拍一个视频动态”,完成后视频动态会在我的界面显示,好友查看你的微信时,会在首界面显示该视频。该视频朋友24小时内可见。

    展开全文
  • 【TechWeb】4月4日,微信派发布公布,从4月4日零时起,微信表情商店、视频动态功能将启动后台服务升级,暂停使用,预计4月6日恢复。其他功能不受影响。其中,已经下载的...
        

    640?wx_fmt=png


    【TechWeb】4月4日,微信派发布公布,从4月4日零时起,微信表情商店、视频动态功能将启动后台服务升级,暂停使用,预计4月6日恢复。其他功能不受影响。


    640?wx_fmt=jpeg

    其中,已经下载的表情及系统表情仍可正常使用。


    目前,微信表情商店已经停用。拍摄视频动态时,微信团队会提醒你:视频动态正在升级中,暂不能发表视频。


    640?wx_fmt=jpeg


    微信视频动态是今年1月微信7.0.2版本新上线的功能。在“微信-我”界面,下拉后出现“拍一个视频动态”,完成后视频动态会在我的界面显示,好友查看你的微信时,会在首界面显示该视频。该视频朋友24小时内可见。



    — 【 THE END 】—


    往期精彩文章回顾:


    640?wx_fmt=jpeg

    1888元!苹果发布Powerbeats Pro耳机 你是要掏空我的钱包吗?


    640?wx_fmt=jpeg

    英雄联盟官宣IG冠军皮肤 彩蛋竟是王思聪吃热狗...


    640?wx_fmt=jpeg

    ofo破产?官方紧急否认:目前运营正常!

    展开全文
  • 前面我们已经完成了spring 3和quartz 2的整合以及动态添加定时任务,我们接着来完善它,使之能支持更多的操作,例如暂停、恢复、修改等。 在动态添加定时任务中其实已经涉及到了其中的一些代码,这里我们再来细化的...

    前面我们已经完成了spring 3和quartz 2的整合以及动态添加定时任务,我们接着来完善它,使之能支持更多的操作,例如暂停、恢复、修改等。

    在动态添加定时任务中其实已经涉及到了其中的一些代码,这里我们再来细化的理一理。先来看一下我们初步要实现的目标效果图,这里我们只在内存中操 作,并没有把quartz的任何信息保存到数据库,即使用的是RAMJobStore,当然如果你有需要,可以实现成JDBCJobStore,那样任务 信息将会更全面,貌似还有专门的监控工具,不过本人没有用过:

    如上图,我们要先列出计划中的定时任务以及正在执行中的定时任务,这里的正在执行中指的是任务已经触发线程还没执行完的情况。比如每天2点执行一个 数据导入操作,这个操作执行时间需要5分钟,在这5分钟之内这个任务才是运行中的任务。当任务正常时可以使用暂停按钮,任务暂停时可以使用恢复按钮。

    trigger各状态说明:

    None:Trigger已经完成,且不会在执行,或者找不到该触发器,或者Trigger已经被删除
    NORMAL:正常状态
    PAUSED:暂停状态
    COMPLETE:触发器完成,但是任务可能还正在执行中
    BLOCKED:线程阻塞状态
    ERROR:出现错误

    计划中的任务

    指那些已经添加到quartz调度器的任务,因为quartz并没有直接提供这样的查询接口,所以我们需要结合JobKey和Trigger来实现,核心代码:

    1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
    2. GroupMatcher<JobKey> matcher =GroupMatcher.anyJobGroup();
    3. Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
    4. List<ScheduleJob> jobList =newArrayList<ScheduleJob>();
    5. for(JobKey jobKey : jobKeys){
    6. List<?extendsTrigger> triggers = scheduler.getTriggersOfJob(jobKey);
    7. for(Trigger trigger : triggers){
    8. ScheduleJob job =newScheduleJob();
    9. job.setJobName(jobKey.getName());
    10. job.setJobGroup(jobKey.getGroup());
    11. job.setDesc("触发器:"+ trigger.getKey());
    12. Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
    13. job.setJobStatus(triggerState.name());
    14. if(trigger instanceofCronTrigger){
    15. CronTrigger cronTrigger =(CronTrigger) trigger;
    16. String cronExpression = cronTrigger.getCronExpression();
    17. job.setCronExpression(cronExpression);
    18. }
    19. jobList.add(job);
    20. }
    21. }

    上面代码中的jobList就是我们需要的计划中的任务列表,需要注意一个job可能会有多个trigger的情况,在下面讲到的立即运行一次任务 的时候,会生成一个临时的trigger也会出现在这。这里把一个Job有多个trigger的情况看成是多个任务。我们前面包括在实际项目中一般用到的 都是CronTrigger ,所以这里我们着重处理了下CronTrigger的情况。

    运行中的任务

    实现和计划中的任务类似,核心代码:

    1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
    2. List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
    3. List<ScheduleJob> jobList =newArrayList<ScheduleJob>(executingJobs.size());
    4. for(JobExecutionContext executingJob : executingJobs){
    5. ScheduleJob job =newScheduleJob();
    6. JobDetail jobDetail = executingJob.getJobDetail();
    7. JobKey jobKey = jobDetail.getKey();
    8. Trigger trigger = executingJob.getTrigger();
    9. job.setJobName(jobKey.getName());
    10. job.setJobGroup(jobKey.getGroup());
    11. job.setDesc("触发器:"+ trigger.getKey());
    12. Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
    13. job.setJobStatus(triggerState.name());
    14. if(trigger instanceofCronTrigger){
    15. CronTrigger cronTrigger =(CronTrigger) trigger;
    16. String cronExpression = cronTrigger.getCronExpression();
    17. job.setCronExpression(cronExpression);
    18. }
    19. jobList.add(job);
    20. }

    暂停任务

    这个比较简单,核心代码:

    1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
    2. JobKey jobKey =JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
    3. scheduler.pauseJob(jobKey);

    恢复任务

    和暂停任务相对,核心代码:

    1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
    2. JobKey jobKey =JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
    3. scheduler.resumeJob(jobKey);

    删除任务

    删除任务后,所对应的trigger也将被删除

    1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
    2. JobKey jobKey =JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
    3. scheduler.deleteJob(jobKey);

    立即运行任务

    这里的立即运行,只会运行一次,方便测试时用。quartz是通过临时生成一个trigger的方式来实现的,这个trigger将在本次任务运行 完成之后自动删除。trigger的key是随机生成的,例如:DEFAULT.MT_4k9fd10jcn9mg。在我的测试中,前面的 DEFAULT.MT是固定的,后面部分才随机生成。

    1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
    2. JobKey jobKey =JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
    3. scheduler.triggerJob(jobKey);

    更新任务的时间表达式

    更新之后,任务将立即按新的时间表达式执行:

    1. Scheduler scheduler = schedulerFactoryBean.getScheduler();
    2.  
    3. TriggerKey triggerKey =TriggerKey.triggerKey(scheduleJob.getJobName(),
    4. scheduleJob.getJobGroup());
    5.  
    6. //获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
    7. CronTrigger trigger =(CronTrigger) scheduler.getTrigger(triggerKey);
    8.  
    9. //表达式调度构建器
    10. CronScheduleBuilder scheduleBuilder =CronScheduleBuilder.cronSchedule(scheduleJob
    11. .getCronExpression());
    12.  
    13. //按新的cronExpression表达式重新构建trigger
    14. trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
    15. .withSchedule(scheduleBuilder).build();
    16.  
    17. //按新的trigger重新设置job执行
    18. scheduler.rescheduleJob(triggerKey, trigger);

    到这里,我们的spring3 整合quartz 2的定时任务功能终于是告一段落了,对常用的一些功能进行了实现,相信可以满足一般项目的需求了。

    转载于:https://my.oschina.net/sniperLi/blog/734840

    展开全文
  • 有人知道怎么搞吗,要配置监听器吗 TriggerKey triggerKey = TriggerKey.triggerKey("myjob1","mygroup"); Trigger trigger = scheduler.getTrigger(triggerKey); if (null != trigger) { ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,472
精华内容 588
关键字:

动态暂停