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>
上一篇下一篇

猜你喜欢

热点阅读