Spring Scheduling -- 任务调度
2018-11-20 本文已影响0人
saoraozhe3hao
文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/integration.html#scheduling
Quartz官网:http://www.quartz-scheduler.org/
cron表达式生成器:http://cron.qqe2.com/
Spring Task 对比 Spring Quartz
1、Spring Task默认单线程串行执行任务,多任务时若某个任务执行时间过长,后续任务会无法及时执行
2、Quartz采用多线程,下一个调度时间到达时,会另起一个线程执行调度,不会发生阻塞问题,但调度过多时可能导致数据处理异常
3、Spring Task抛出异常后,同一个任务后续不再触发
4、Spring Quartz抛出异常后,同一个任务后续仍然会触发
Spring Task应用组成
1-0、SpringMVC配置:Spring Bean配置
<context:component-scan base-package="com.hogen.*" />
<context:annotation-config />
<task:executor id="executor" pool-size="5" /> <!-- executor线程池 -->
<task:scheduler id="scheduler" pool-size="5" /> <!-- scheduler线程池 -->
<task:annotation-driven executor="executor" scheduler="scheduler" />
1-1、SpringBoot配置:给主类增加注解 @EnableScheduling
2、定义任务
@Scheduled(cron = "0/5 * * * * ? ") // cron 表达式 有 6域 和 7域 两种,这里只能使用6域,即7域的前6域
public void startJob() {
System.out.println("1");
}
Spring Quartz应用组成
1、配置Maven依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
2、Spring Bean配置
层次结构:调度器 -> 触发器 -> 任务
<!-- 任务定义 -->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jobBean"/> <!-- 目标bean -->
<property name="targetMethod" value="startJob"/> <!-- 目标方法 -->
<property name="concurrent" value="false"/> <!-- 同一个job没执行完,不启动下一次执行 -->
</bean>
<!-- 简单触发器 -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail"/>
<property name="startDelay" value="1000"/> <!-- 1秒后开始 -->
<property name="repeatInterval" value="5000"/> <!-- 每5秒执行一次 -->
</bean>
<!-- cron触发器 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail"/>
<property name="cronExpression" value="0/5 * * * * ? "/>
</bean>
<!-- 调度器 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
<ref bean="simpleTrigger"/>
</list>
</property>
</bean>