定时任务发展史(一)

简介:

定时任务是互联网行业里最常用的服务之一,本文给大家介绍定时任务在我司的发展历程。

linux系统中一般使用crontab命令来实现,在Java世界里,使用最广泛的就是quartz了。我司使用quartz就已经升级了三代,每一代在上一代系统之上有所优化,写这篇文章一方面介绍一下quartz的使用,另一方面可以根据此项目的变迁反应出我司平台架构升级的一个缩影。

定时任务的使用场景很多,以我们平台来讲:计息,派息、对账等等。

quartz 介绍

Quartz是个开源的作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。Quartz可以集成几乎任何的java应用程序—从小的单片机系统到大型的电子商务系统。Quartz可以执行上千上万的任务调度。

Quartz核心的概念:scheduler任务调度、Job任务、JobDetail任务细节、Trigger触发器

  • Scheduler:调度器,调度器接受一组JobDetail+Trigger即可安排一个任务,其中一个JobDetail可以关联多个Trigger
  • Job:Job是任务执行的流程,是一个类
  • JobDetail:JobDetail是Job是实例,是一个对象,包含了该实例的执行计划和所需要的数据
  • Trigger:Trigger是定时器,决定任务何时执行

使用Quartz调度系统的思路就是,首先写一个具体的任务(job),配置任务的触发时间(Trigger),Scheduler很根据JobDetail+Trigger安排去执行此任务。

Quartz 定时器的时间设置

时间的配置如下:0 30 16 * * ?

时间大小由小到大排列,从秒开始,顺序为 秒,分,时,天,月,年 *为任意 ?为无限制。由此上面所配置的内容就是,在每天的16点30分启动buildSendHtml() 方法

具体时间设定可参考 :

"0/10 * * * * ?" 每10秒触发
"0 0 12 * * ?" 每天中午12点触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 0 06,18 * * ?" 在每天上午6点和下午6点触发

第一代定时任务系统

第一代定时任务系统使用的很简单,全部按照当时spring推荐的配置方式来进行,开发于2014年初。

首先在配置线程池

<bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="50" />
    <property name="maxPoolSize" value="100" />
    <property name="queueCapacity" value="500" />
</bean>

配置定时任务工厂和任务基类

<bean id="timerFactory" class="com.zx.timer.TimerFactory" />

<bean id="baseTask" class="com.zx.timer.core.BaseTask">
    <property name="machineId" value="${machine.id}"/>
    <property name="recordErrorDetail" value="${is.record.errordetail}"/>
</bean>
  • machineId:机器编码
  • recordErrorDetail:是否记录详细日志

通过timerFactory 来获取具体的任务和触发器

public class TimerFactory implements BeanFactoryAware {

    private BeanFactory beanFactory;

    public Object getTask(String taskCode) {
        return beanFactory.getBean(taskCode+"Task");
    }
    
    public Object getTrigger(String taskCode) {
        return beanFactory.getBean(taskCode+"Trigger");
    }

    public void setBeanFactory(BeanFactory beanFactory) {
        this.beanFactory = beanFactory;
    }

    public BeanFactory getBeanFactory() {
        return beanFactory;
    }
}

baseTask集成了task,在里面做了一些基础的业务,比如定时任务开始执行的时候记录定时任务的开始执行时间,定时任务结束的时候记录执行的结果等。

public interface Task {
    public void executeTask();
}

配置具体的定时任务。以重发短信邮件的定时任务为例

<bean
目录
相关文章
|
8月前
|
存储 开发框架 Java
分布式定时任务框架Quartz总结和实践(1)
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。
102 0
|
8月前
|
容灾 网络协议
极客时间架构实战营模块 7 作业
极客时间架构实战营模块 7 作业
57 0
|
10月前
|
调度
【解决方案 二十】作业调度系统cron表达式详解
【解决方案 二十】作业调度系统cron表达式详解
47 0
|
10月前
|
消息中间件 存储 缓存
分布式定时任务 | 青训营笔记
分布式定时任务 | 青训营笔记
82 0
|
监控 NoSQL Java
几种主流的分布式定时任务,你知道哪些?
几种主流的分布式定时任务,你知道哪些?
|
12月前
|
消息中间件 监控 算法
分布式定时任务框架选型,写的太好了 !
分布式定时任务框架选型,写的太好了 !
|
分布式计算 前端开发 数据可视化
你只会用 xxl-job?一款更强大、新一代分布式任务调度框架来了,太强大了!
你只会用 xxl-job?一款更强大、新一代分布式任务调度框架来了,太强大了!
642 0
你只会用 xxl-job?一款更强大、新一代分布式任务调度框架来了,太强大了!
|
存储 资源调度 分布式计算
分布式定时任务那些事儿|青训营笔记
所有需要定时、延时、周期性执行任务的业务场景,都可以考虑使用分布式定时任务,这篇笔记大致介绍了一下分布式定时任务的概念及应用场景。
139 0
分布式定时任务那些事儿|青训营笔记
|
运维 NoSQL 数据库连接
定时任务能力进击!Quartz框架的使用
定时任务能力进击!Quartz框架的使用
|
缓存 Java 调度
技术汇总:第九章:任务调度SpringTask
技术汇总:第九章:任务调度SpringTask
107 0

热门文章

最新文章