Spring与Quartz的任务调度比较
任务调度代码比较
Spring 2.x 任务调度示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<bean id="demoJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 目标Bean --> <property name="targetObject"> <bean class="cc.gmem.demo.DemoService" /> </property> <!-- 目标方法 --> <property name="targetMethod" value="doStuff" /> <!-- 防止并发执行 --> <property name="concurrent" value="false" /> </bean> <!-- 简单触发器 --> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="demoJob" /> <!-- 启动后,调度开始的时间 --> <property name="startDelay" value="0" /> <!-- 每隔2000ms调度一次 --> <property name="repeatInterval" value="2000" /> </bean> <!-- Cron触发器 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="demoJob" /> <property name="cronExpression" value="15 0/2 * * * ?" /> </bean> <!-- 调度工厂Bean --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="simpleTrigger" /> <ref bean="cronTrigger" /> </list> </property> </bean> |
Spring 3.x 任务调度示例
配置文件方式
1 2 3 4 5 6 7 |
<!-- 任务调度器配置,pool-size为线程池大小,限制了同时最多被调度的任务 --> <task:scheduler pool-size="100" id="scheduler" /> <!-- 任务计划列表,支持固定频率、固定延迟、Cron表达式等 --> <task:scheduled-tasks scheduler="scheduler"> <task:scheduled fixed-rate="120000" method="doStuff" ref="demoService" /> <task:scheduled cron="15 0/2 * * * ?" method="doStuff" ref="demoService" /> </task:scheduled-tasks> |
注解方式
如果使用该方式,必须声明task:annotation-driven,如果不使用aspectj,则mode应设置为proxy。
1 2 |
<task:annotation-driven scheduler="scheduler" executor="taskExecutor" mode="aspectj" /> <task:scheduler pool-size="100" id="scheduler" / |
在Service类中,使用@Scheduled来标注需要调度的方法
1 2 3 4 5 6 7 8 |
package cc.gmem.demo; @Component("demoService") public class DemoService(){ @Scheduled(cron = "15 0/2 * * * ?") public void doStuff(){ } } |
Quartz任务调度示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import static org.quartz.JobBuilder.*; import static org.quartz.TriggerBuilder.*; import static org.quartz.SimpleScheduleBuilder.*; import static org.quartz.CronScheduleBuilder.*; StdSchedulerFactory schedulerFactory = new StdSchedulerFactory(); Properties pros = new Properties(); pros.setProperty( "org.quartz.scheduler.instanceName", "MyScheduler" ); pros.setProperty( "org.quartz.threadPool.threadCount", "10" );//调度器线程数 pros.setProperty( "org.quartz.jobStore.class", "org.quartz.simpl.RAMJobStore" );//任务存储,可以用于持久化 schedulerFactory.initialize( pros ); Scheduler scheduler = schedulerFactory.getScheduler(); //启动调度器 scheduler.start(); JobDetail job = newJob( helloWorldJob.class ).build(); //简单触发器 Trigger trigger = newTrigger().startNow().withSchedule( simpleSchedule().withIntervalInSeconds( 1 ).repeatForever() ).build(); //Cron表达式触发器 trigger = newTrigger().startNow().withSchedule( cronSchedule( "15 0/2 * * * ?" )).build(); scheduler.scheduleJob( job, trigger ); TimeUnit.SECONDS.sleep( 1800 ); //关闭调度器 scheduler.shutdown(); |
特性比较
比较项 | Spring2.x | Spring3.x | Quartz |
优缺点 | 比较繁琐,除非是老项目维护的需要,不建议使用 | 配置简单,对注解、配置文件方式的支持均较好 | 比较强大,支持任务状态的持久化 |
重叠执行(overlap) | JobDetail中设置concurrent属性可以防止重叠执行 | 默认是不允许重叠执行的,如果需要,在目标方法上添加@Async注解 | 在Job的实现类上添加:@DisallowConcurrentExecution可以防止重叠执行 |
Leave a Reply