任务调度和异步执行

任务调度

概述:

任务调度涉及多线程并发、运行时间规则制定及解析、运行现场保持与恢复、线程池维护等诸多方面的工作。


Web服务器在接受请求时,会创建一个新的线程服务。资源有限,必须对资源进行控制,首先必须限制服务线程的最大数目,其次考虑以线程池共享服务的线程资源,降低频繁创建、销毁线程的消耗。

  • Quartz
  • 有强大的任务调度机制,允许开发人员灵活的定义触发器的调度时间表,并可将触发器与任务进行关联映射,还有调度运行环境的持久化机制,可以保存并恢复调度现场,即使系统因故障关闭。任务调度数据也不会丢失,还有组件式的侦听器,各种插件,线程池等功能
  • 调度器(Schedule)、任务(Job)、触发器(Trigger)

任务调度信息存储
包括运行次数,调度规则,JobDataMap中的数据等

  1. 通过配置文件调整任务调度的保存策略

    org.Quartz包下有默认的quartz.properties,可以在类路径下添加quartz.properties文件覆盖,主要包含三方面的信息:(1)集群信息、(2)调度器线程池、(3)任务调度现场的信息保存

    保存到数据库必须使用org.quartz.impl.jdbcjobstore.JobStoreTX

  2. Spring中使用Quartz

    Spring 提供了SchedulerFactoryBean(功能):

    以更具bean的方式提供配置信息

    让Sheduler和Spring的生命周期建立关联

    通过属性配置代替Quartz的自身配置文件

  3. Spring中使用JDK Timer

    1.JDK Timer只适合短时间的任务调度–在Timer中所有的TimerTask都在同一线程中执行。再也无需求超过Java Timer的调度工作时应该使用Quartz

    2.TimerTask代表一个需要多次执行的任务,实现了Runable接口相当于Quartz中的Job,但是每次执行任务,TimerTask不会每次都创建一个实例

    3.Timer延迟一段时间或在指定时间点之后运行一次任务或周期性的运行任务。在Timer内部使用Object#wait(long time)进行任务的时间调度,不能保证任务的实时执行,粗略

  4. 实际应用中的任务调度
    动态产生任务的方式:

    1.在业务流程中产生:某个业务需要用到任务,如果任务的执行时间点离业务的操作时间点不是太长,就可以在业务中安排好任务

    2.由扫描任务周期性产生:根据业务数据动态产生任务,要保证严格的执行时间点并减小对数据库的影响,需要一个产生最近执行任务的扫描任务定期查询数据库,并为那些在一小段时间后就要执行的潜在任务进行动态安排,周期性的扫描业务表,查询后续的扫描周期时间范围内将要执行的任务,创建并安排这些任务
    好处:
    (1)降低对数据库的影响。
    (2)缩短调度器中任务列队的长度。
    (3)保证任务在精确的时间点执行。

  5. 任务调度对应用程序集群的影响
    全局任务:指哪些执行结果会影响全局的任务。最好在一个服务器节点上执行否则可能会因重复多次执行而引发系统的逻辑错误。
    本地任务:执行结果仅影响本地,需要在每个服务器部署任务。
    Quartz可执行集群部署,让多个节点互为热备通过一个中间数据库或者Twrracotta实现集群,无法区分全局任务和本地任务,只能已调度节点为单位开启或者关闭任务。
  6. 任务调度云
    目标:
    1>任务调度无需双机热备硬件支持,具有“软故障迁移”功能,避免系统的单点故障。
    2>无需独立部署,且不会造成单任务多次运行的问题
    3>任务调度的服务器可分配、可管理、可切换、可监控。
    4>任务本身可管理、控制、管理。
    5>任务的程序开发简单易行,对调度运行环境完全透明。
    基础设施:
    1>任务调度识别器:任务调度云开始运行时,首先启动,根据控制台的资源定义将制定的服务器加入任务调度云中,完成任务调度云的组建。
    2>故障迁移器:监控云中的服务器状态,实现调度服务的热切换
    3>控制命令执行器:任务调度管理员可在管理控制台向调度云发布控制命令,控制命令执行器发现新命令就下载并执行新命令。
    4>运行日志记录器:记录任务调度云中任务运行的详细日志。

你可能感兴趣的:(网络,Spring)