![f58d8079c363932c0f396c13ddb3ebfd.gif](https://img-blog.csdnimg.cn/img_convert/f58d8079c363932c0f396c13ddb3ebfd.gif)
最近在项目开发中进行了一些Spring定时任务的开发工作,在开发过程中对Spring定时任务的配置方式进行了一些研究,现在对各种配置方式进行一个总结。Scheduled是Spring支持的定时任务配置方式,可以用注解或者配置文件的方式进行配置。
Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,它是一个开源的由OpenSymphony维护的项目,开发者能够在Java EE,或单独的Java SE应用中使用它。无论是简单的任务调度,还是复杂的企业级应用,Quartz都能够很好地胜任。
Quartz支持CronTriggerBean,SimpleTriggerBean两种模式,CronTriggerBean比 SimpleTriggerBean功能更强大,它能够控制任务执行的精确时间,比如,早上九点半需要执行某QuartzJobBean中给定的任务。
以下对不同的配置方式分别进行介绍。
![b47d3f51a86fd477e5e9949b5ed46ee7.png](https://img-blog.csdnimg.cn/img_convert/b47d3f51a86fd477e5e9949b5ed46ee7.png)
<task:scheduled-tasks scheduler="scheduler" >
<task:scheduled ref="profitScheduler" method="execute" cron="0 0/2 * * * ?" initial-delay="5000" fixed-delay="3600000" />
task:scheduled-tasks>
<task:scheduler id="scheduler" pool-size="5" />
也可以采用注解的方式,在需要配置为定时任务的方法上添加@Scheduled(cron = "0 0 3 * * ?"),cron为定时任务表达式,cron表达式支持非常丰富的配置规则。
@Component(“taskJob”)
public class TaskJob { k
@Scheduled(cron = "0 0 3 * * ?")
public void job1() {
System.out.println(“任务进行中。。。”);
}
}
配置任务执行的线程池信息。task:scheduler用来配置任务调度线程池大小,调度线程在被调度任务完成前不会空闲;task:executor用来配置任务执行器的具体参数,pool-size 可以指定执行线程池的初始大小、最大大小,queue-capacity配置等待执行任务的队列容量,reject-policy当等待队列爆了时的策略,分为丢弃、有任务执行器直接执行等方式。
<task:executor id="executor" pool-size="10-10000" queue-capacity="5000" rejection-policy="CALLER_RUNS"/>
<task:scheduler id="scheduler" pool-size="1000"/>
<task:annotation-driven executor="executor" scheduler="scheduler"/>
![4bcf71f1a4535af65472de462f364d96.png](https://img-blog.csdnimg.cn/img_convert/4bcf71f1a4535af65472de462f364d96.png)
CronTrigger 支持比simpleTrigger更具体的调度,CronTrigger支持类似日历的重复间隔。CronTrigger 由MethodInvokingJobDetailFactoryBean、CronTriggerFactoryBean两个类支持。
MethodInvokingJobDetailFactoryBean配置需要定时执行的任务类和方法,targetObject为执行定时任务的bean,targetMethod为执行定时任务的bean中的方法。CronTriggerFactoryBean为定时任务的触发器,用来配置定时任务执行的时间表达式。
"sycnMonitorBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">"targetObject" ref="monitorService" />"targetMethod" value="syncMonitor" />
"syncTrigger"class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">"jobDetail" ref="sycnMonitorBean" />"cronExpression" value="0 */10 * * * ?" />
![ff5e6e77d633077db1168e2dd6780d73.png](https://img-blog.csdnimg.cn/img_convert/ff5e6e77d633077db1168e2dd6780d73.png)
<bean id="quartzBean" class="com.abchina.tao.scheduled.QuartzMain">
<property name="scheduler" ref="schedulerManager">property>
bean>
<bean id="quartzJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="quartzBean">property>
<property name="targetMethod" value="startQuartz">property>
<property name="concurrent" value="false" />
bean>
<bean id="quartzTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="quartzJobDetail">property>
<property name="startDelay" value="1000">property>
<property name="repeatInterval" value="300000">property>
bean>
<bean id="schedulerManager" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="quartzTrigger" />
list>
property>
bean>
![cac5dbc9071855301a62e0b9957d8575.png](https://img-blog.csdnimg.cn/img_convert/cac5dbc9071855301a62e0b9957d8575.png)
![81bdfe578c30492f1630c651fc99b6f8.png](https://img-blog.csdnimg.cn/img_convert/81bdfe578c30492f1630c651fc99b6f8.png)
MethodInvokingJobDetailFactoryBean mijdfb=new MethodInvokingJobDetailFactoryBean();
mijdfb.setName(qm.getEnvId());
mijdfb.setTargetObject(beanFactory.getBean("service",Mservice.class));
mijdfb.setTargetMethod("runTask");
mijdfb.setConcurrent(false);
TestEnvDomain [] params = new TestEnvDomain[1];
params[0] = qm;
mijdfb.setArguments(params);
mijdfb.afterPropertiesSet();
org.quartz.JobDetail jd=new JobDetailImpl();
jd=mijdfb.getObject();
scheduler.addJob(jd, true);
(2)实例化触发器
首先实例化CronTriggerFactoryBean,然后添加对应job的时间表表达式等参数信息,然后调用afterPropertiesSet(),这个方法和MethodInvokingJobDetailFactoryBean 中的afterPropertiesSet()类似,最终实例化一个CronTriggerImplString triggerName=qm.getEnvId() +"Trigger";
CronTriggerFactoryBean ctb=new CronTriggerFactoryBean();
ctb.setName(triggerName);
ctb.setCronExpression(qm.getCronExpression());
ctb.setJobDetail(jd);
ctb.afterPropertiesSet();
CronTrigger cronTrigger= ctb.getObject();
scheduler.scheduleJob(cronTrigger);
scheduler.rescheduleJob(cronTrigger.getKey(), cronTrigger);
以上对Scheduled注解方式、配置文件方式,CronTriggerFactoryBean,SimpleTriggerFactoryBean配置文件方式,CronTriggerFactoryBean通过java任务管理器动态创建等不同定时任务配置方法进行了较详细的说明。
通过以上各种配置方式的对比,可以看出,各种配置方式操作都不是特别复杂
,相对来说Scheduled配置方式更加的轻量级一些,在一些相对不是很复杂、不涉及线程特别多的场景下可以使用。
Quartz配置方式是一种更加重量级、多线程、分布式等场景下的定时任务配置方式。
希望对遇到定时任务配置问题的朋友,可以做一些比较,选择合适的定时任务配置方式。
热 文 推 荐
☞为什么 k8s 在阿里能成功?| 问底中国 IT 技术演进 ☞微信付费阅读支付宝可用,iOS抽成30%; 苹果安卓充电器或统一;UOS 20发布 | 极客头条 ☞如何实现自动化前端开发? ☞阿里将开源进行到底!☞斯坦福博士退学,在 3 个领域改变世界,科技狂人马斯克的巅峰之路
☞滴滴章文嵩:一个人的20年开源热情和国内互联网开源运动
☞详谈ARM架构与ARM内核发展史
☞BSV魔幻爆拉背后:CSW称拿到自证中本聪的关键证据
![5d6a2bc2734c12efe02a2c04d89745dc.png](https://img-blog.csdnimg.cn/img_convert/5d6a2bc2734c12efe02a2c04d89745dc.png)