探求Spring的守时使命装备

2020-1-17 编辑:采编部 来源:互联网 阅读次数:
  882828九五至尊手机版: 作者 | 郭朝兴 责编 | Elle 最近在项目开发中进行了一些Spring定时任务的开发工作,在开发过程中对Spring定时任务的配置方式来进行了一些研究,现在对各种配置方式来进行一个总结。Scheduled是S...

作者 | 郭朝兴

责编 | Elle

最近在项目开发中进行了一些Spring定时任务的开发工作,在开发过程中对Spring定时任务的配置方式来进行了一些研究,现在对各种配置方式来进行一个总结。Scheduled是Spring支持的定时任务配置方式,可以用注解或者配置文件的方式来进行配置。

Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,它是一个开源的由OpenSymphony维护的项目,开发者能够在Java EE,或单独的Java SE应用中使用它。无论是简单的任务调度,还是复杂的企业级应用,Quartz都能够很好地胜任。

Quartz支持CronTriggerBean,SimpleTriggerBean两种模式,CronTriggerBean比 SimpleTriggerBean功能更强大,它能够控制任务执行的精确时间,比如,早上九点半需要执行某QuartzJobBean中给定的任务。

以下对不同的配置方式分别进行介绍。

通Scheduled注解或者xml配置的方式添加定时任务

ref 是定时任务的类在 Spring中的beanName,method是要执行的方法,fixed-delay 是上一个调用完成后,再次调用的延时,fixed-rate 是 上一个调用开始后,再次调用的延时(不用等待上一次调用完成),cron 是表达式,表示在何时进行任务调度。

< task:scheduled-tasksscheduler= "scheduler">

< task:scheduledref= "profitScheduler"method= "execute"cron= "0 0/2 * * * ?"initial-delay= "5000"fixed-delay= "3600000"/>

</ task:scheduled-tasks>

< task:schedulerid= "scheduler"pool-size= "5"/>

也能够使用注解的方式,在需要配置为定时任务的方法上添加@Scheduled(cron = "0 0 3 * * ?"),cron为定时任务表达式,cron表达式支持非常丰富的配置规则。

@Component(“taskJob”)

publicclassTaskJob{ k

@Scheduled(cron = "0 0 3 * * ?")

publicvoid job1 {

System. out.println(“任务进行中。。。”);

}

}

配置任务执行的线程池信息。task:scheduler用来配置任务调度线程池大小,调度线程在被调度任务完成前不会空闲;task:executor用来配置任务执行器的具体参数,pool-size 可以指定执行线程池的初始大小、最大大小,queue-capacity配置等待执行任务的队列容量,reject-policy当等待队列爆了时的策略,分为丢弃、有任务执行器直接执行等方式。

< task:executorid= "executor"pool-size= "10-10000"queue-capacity= "5000"rejection-policy= "CALLER_RUNS"/>

< task:schedulerid= "scheduler"pool-size= "1000"/>

< task:annotation-drivenexecutor= "executor"scheduler= "scheduler"/>

CronTrigger配置方式

CronTrigger 支持比simpleTrigger更具体的调度,CronTrigger支持类似日历的重复间隔。CronTrigger 由MethodInvokingJobDetailFactoryBean、CronTriggerFactoryBean两个类支持。

MethodInvokingJobDetailFactoryBean配置需要定时执行的任务类和方法,targetObject为执行定时任务的bean,targetMethod为执行定时任务的bean中的方法。CronTriggerFactoryBean为定时任务的触发器,用来配置定时任务执行的时间表达式。

<bean id= "sycnMonitorBean"class= "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

<property name= "targetObject"ref= "monitorService"/>

<property name= "targetMethod"value= "syncMonitor"/>

</bean>

<bean id= "syncTrigger"

class= "org.springframework.scheduling.quartz.CronTriggerFactoryBean">

<property name= "jobDetail"ref= "sycnMonitorBean"/>

<property name= "cronexpression"value= "0 */10 * * * ?"/>

</bean>

SimpleTigger配置方式

当需要在规定的时间执行一次或者以一定的时间间隔重复出发执行job时,SimpleTrigger 就能够完全满足要求。SimpleTrigger的属性有:开始时间、结束时间、重复次数、重复时间间隔。

如下示例:首先创建需要执行定时任务的bean,名字为quartzBean。然后配置该bean需要定时执行的方法。Concurrent参数用来配置是否同步执行。如果配置为true,则任务执行时,只有上次执行完成后,才可以进入下一次执行。

SimpleTriggerFactoryBean配置了触发器执行的策略,开始执行的延迟时间及执行的时间间隔。SchedulerFactoryBean用来管理任务计划,是任务的总的管理类。将lazy-init="false"那么容器启动就会执行调度程序。

< beanid= "quartzBean"class= "com.abchina.tao.scheduled.QuartzMain">

< propertyname= "scheduler"ref= "schedulerManager"></ property>

</ bean>

<!-- 定义jobdetail -->

< beanid= "quartzJobDetail"class= "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

< propertyname= "targetObject"ref= "quartzBean"></ property>

< propertyname= "targetMethod"value= "startQuartz"></ property>

< propertyname= "concurrent"value= "false"/>

</ bean>

< beanid= "quartzTrigger"

class= "org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">

< propertyname= "jobDetail"ref= "quartzJobDetail"></ property>

< propertyname= "startDelay"value= "1000"></ property>

< propertyname= "repeatInterval"value= "300000"></ property>

</ bean>

<!-- 任务计划,总管理类-->

< beanid= "schedulerManager"lazy-init= "false"autowire= "no"class= "org.springframework.scheduling.quartz.SchedulerFactoryBean">

< propertyname= "triggers">

< list>

< refbean= "quartzTrigger"/>

</ list>

</ property>

</ bean>

SimpleTrigger与CronTrigger高级应用场景

针对需要将定时任务配置为按照每个用户的实际运行需要,动态调整任务执行的计划,并准实时生效的情况。能够使用配置页面的方式由用户选择任务的执行计划,然后将各个任务的执行计划添加到数据库中。周期性的从数据库中读取定时任务信息,添加、更新、删除定时任务线程。

当Spring 启动时,就会创建schedulerManager作为总的管理类,由schedulerManager来管理所有的任务,schedulerManager在后台每隔一定的时间(配置)执行一次,来监测数据库中需要创建和更新的定时任务。

schedulerManager读取数据库中的定时任务(任务类、任务方法、执行时间),判断定时触发器中是不是真的存在该任务,如果存在,比较数据库中的任务表达式(cron)是否与当前定时器中的时间一致,如果不一致,更新当前任务时间表达式。如果不存在该任务,将任务加入到定时器中。

此种方式创建任务也是基于MethodInvokingJobDetailFactoryBean,CronTriggerFactoryBean 两个类,但是创建方式为通过代码进行实例化,能够准确的通过实际需要动态的创建,灵活性更加强,使用起来也更加的方便,创建任务有2个步骤,具体如下:

(1)实例化任务

首先实例化MethodInvokingJobDetailFactoryBean,MethodInvokingJobDetailFactoryBean是spring自带的,并将数据库中配置的job相关信息添加到mijdfb,然后调用afterPropertiesSet方法,这个方法会实例化一个JobDetailImpl,并将相应的信息添加到JobDetailImpl中。该过程实例化了需要定时调度的类和方法,并可以向类和方法中传入制定的参数,使用配置文件的方式无法达到对应的效果。

MethodInvokingJobDetailFactoryBean mijdfb= newMethodInvokingJobDetailFactoryBean;

mijdfb.setName(qm.getEnvId);

mijdfb.setTargetObject(beanFactory.getBean( "service",Mservice.class));

mijdfb.setTargetMethod( "runTask");

mijdfb.setConcurrent( false);

TestEnvDomain [] params= newTestEnvDomain[ 1];

params[ 0] = qm;

mijdfb.setArguments( params);

mijdfb.afterPropertiesSet;

org.quartz.JobDetail jd= newJobDetailImpl;

jd=mijdfb.getObject;

scheduler.addJob(jd, true);

(2)实例化触发器

首先实例化CronTriggerFactoryBean,然后添加对应job的时间表表达式等参数信息,然后调用afterPropertiesSet,这个方法和MethodInvokingJobDetailFactoryBean 中的afterPropertiesSet类似,最终实例化一个CronTriggerImpl

StringtriggerName=qm.getEnvId + "Trigger";

CronTriggerFactoryBean ctb= newCronTriggerFactoryBean;

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配置方式是一种更加重量级、多线程、分布式等场景下的定时任务配置方式。希望对遇到定时任务配置问题的朋友,可以做一些比较,选择正真适合的定时任务配置方式。


本文关键词:

文章出自:互联网,文中内容和观点不代表本网站立场,如有侵权,请您告知,我们将及时处理。

 
 
886868.cc - 时尚潮流辣妈必逛的育儿网站 - 凯娜科技
886868.cc 时尚潮流辣妈必逛的育儿网站 服务QQ:790646582 e-mail:zk8312@163.com
Copyright @ 886868.cc 2014 All Rights Reserved | 吉ICP备14005127号-2
本站部分资源来自网友上传,如果无意之中侵犯了您的版权,请联系本站,本站将在3个工作日内删除。