zoukankan      html  css  js  c++  java
  • Spring+Quartz 整合二:调度管理与定时任务分离

      新的应用场景:很多时候,我们常常会遇到需要动态的添加或修改任务,而spring中所提供的定时任务组件却只能够通过修改xml中trigger的配置才能控制定时任务的时间以及任务的启用或停止,这在带给我们方便的同时也失去了动态配置任务的灵活性。所有的配置都在xml中完成,包括cronExpression表达式,十分的方便。但是如果我的任务信息是保存在数据库的,想要动态的初始化,而且任务较多的时候不是得有一大堆的xml配置?或者说我要修改一下trigger的表达式,使原来5秒运行一次的任务变成10秒运行一次,这时问题就来了,试过在配置文件中不传入cronExpression等参数,但是启动时就报错了,难道我每次都修改xml文件然后重启应用吗,这显然不合适的。最理想的是在与spring整合的同时又能实现动态任务的添加、删除及修改配置。

    场景要求:
    1、减少spring的配置文件,为了实现一个定时任务,spring的配置代码太多了。
    2、用户可以通过页面等方式添加、启用、禁用某个任务。
    3、用户可以修改某个已经在运行任务的运行时间表达式,CronExpression。
    4、为方便维护,简化任务的运行调用处理,任务的运行入口即Job实现类最好只有一个,该Job运行类相当于工厂类,在实际调用时把任务的相关信息通过参数方式传入,由该工厂类根据任务信息来具体执行需要的操作。

    分析:配置文件的模式是将配置中中job、trigger等取出来排程,采用数据库存储也是一样的 取出来组装排程

    步骤:
    步骤一:spring配置文件

    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <beans xmlns="http://www.springframework.org/schema/beans"
    3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    5 
    6     <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"/>
    7 </beans>

    步骤二:创建任务,将任务存入数据库,对人物进行启动、删除、暂停、恢复、立即运行一次处理

    注意:任务的处理不仅仅是任务 还有触发器 等  而且有些操作有先后限制  比如删除,要先暂停触发器  后移除触发器 然后移除任务等

     步骤三:创建定时任务:两种创建方式:实现Job接口或者继承QuartzJobBean抽象类。名字和实体bean里的jobname一致。

    public class QuartzJob extends QuartzJobBean{}

    public class QuartzJob implements Job {} 

    注意:
    1、trigger各状态说明:
    None:Trigger已经完成,且不会在执行,或者找不到该触发器,或者Trigger已经被删除 NORMAL:正常状态 PAUSED:暂停状态 COMPLETE:触发器完成,但是任务可能还正在执行中 BLOCKED:线程阻塞状态 ERROR:出现错误
    2、更新任务 直接更新不起作用,要先删除后新创建;
    3、同步和异步:同步和异步在quartz 2.2的版本中对于使用者来说区别只在于是否在job类上添加了@DisallowConcurrentExecution注解,需要注意在定时任务运行时更新是没有办法改变同步和异步的
    4、集群、分布式架构实现探讨:使用消息机制,通过分发和接收信息来实现对集群中定时任务的管理。

    5、执行多次的问题:triger在定义时有一个默认的参数startTime,如果不设置的话会默认设置为now
    CronTrigger trigger = newTrigger().withIdentity("trigger1", "group1").startNow().withSchedule(cronSchedule("0/2 * * * * ?")).build();

    6、scheduler.getCurrentlyExecutingJobs():获取的不是打开状态的任务,而是正在执行的任务。比如我五秒钟打一行字符串,如果我在程序打字符串的时候正好执行scheduler.getCurrentlyExecutingJobs(),那么就可以得到。但是程序打字符串的时间是极短的,所以基本得不到。
    7、定时任务启停:scheduler.isShutdown()将关闭定时任务的线程和相关资源 无法再次重启,所以如果要停止所有定时任务不要使用这个方法,可以使用standby或者遍历所有任务进行unscheduleJob(TriggerKey triggerKey),开启使用start(),系统启动后 默认是standby模式 需要start()一下才能开启所有任务;
    系统启动后定时任务框架启动概述信息:
    Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. --Scheduler排程类 以及加载是否成功
    NOT STARTED. --当前是否开启
    Currently in standby mode. --默认启动模式
    Number of jobs executed: 0 --目前执行过的定时任务数目
    Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.--默认启动十个线程支持
    Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.--使用RAMJobStore不支持持久化

    参考:
    http://www.dexcoder.com/selfly/article/308
    http://www.dexcoder.com/selfly/article/1822?curPage=83#comment
    http://blog.csdn.net/pengpegv5yaya/article/details/37595889

  • 相关阅读:
    滚轮事件的防冒泡、阻止默认行为的代码(效果是:只让当前div滚动,连当前文档都不滚动的效果)
    js原生封装getClassName()方法-ie不支持getElementsByClassName,所以要自己实现获取类名为className的所有元素
    使用 RequireJS 优化 Web 应用前端
    javascript的页面加载及性能优化(兼容IE7)
    JavaScript中的this陷阱的最全收集--没有之一
    mysql 配置MHA
    mysql 在linux下的完整安装过程
    vue 开发系列(八) 动态表单开发
    vue 开发系列(七) 路由配置
    vue 开发系列(六) 企业微信整合
  • 原文地址:https://www.cnblogs.com/cac2020/p/5919322.html
Copyright © 2011-2022 走看看