在使用过Quartz过的人应该都清楚,Quartz的cron表达式是可以在外部的配置文件中配置的。那么Spring的任务调度@Scheduled 中cron可以在外部配置么?如果可以又怎么配置呢?

先抛出来一个引子(PS:急性子朋友可以直接跳过往下看哦~ )。下面就以一段Demo为例:

在xml中:

<!-- 开启Spring注解 --> 
<context:annotation-config/>

<!-- 扫描 Task 包 -->
<context:component-scan base-package="com.baikeyang.task"/>

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
	<!-- 核心线程数 -->
	<property name="corePoolSize" value="2" />
	<!-- 最大线程数 -->
	<property name="maxPoolSize" value="4" />
	<!-- 队列最大长度 -->
	<property name="queueCapacity" value="10" />
	<!-- 线程池维护线程所允许的空闲时间,默认为60s -->
	<property name="keepAliveSeconds" value="60" />
</bean>

<!-- 注解式 -->
<task:annotation-driven executor="taskExecutor" proxy-target-class="true"/>

Java代码:

package com.baikeyang.task;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * @Project: Demo
 * @Description: ${TODO}
 * @Package: com.baikeyang.task
 * @Class: ${FILE_NAME}
 * @See:
 * @Author: baikeyang@vip.qq.com
 * @DateTime: 2018/3/28 10:31
 * @ComputerUser: ${user}
 * @Version: v1.0.0
 * @CopyRight: 2018
 */
@Component(value = "taskJob")
public class TaskJob{

    protected Logger log = LoggerFactory.getLogger(TaskJob.class);

    @Scheduled(cron = "0 */1 * * * ?")
    public void taskGo(){
        log.info("Task Job 开始执行啦…………………………………………………………………………");
    }

}

上面这种方式是在注解中配置写死的。如果这个时候我将项目发布到测试环境,测试人员需要测试这个任务需要修改任务调度时间,就需要开发人员不停的给测试人员编译class文件。那这样的做法是不是相当的不靠谱呢?就如我在文章开头说的那样,他能不能像Quartz一样在外部配置呢?OK,下面的Demo就是。

xml:

<!-- 开启Spring注解 --> 
<context:annotation-config/>

<!-- 扫描 event包 -->
<context:component-scan base-package="com.baikeyang.task"/>

<bean id="taskJob" class="com.wangzhixuan.task.TaskJob"></bean>

<task:scheduled-tasks>
	<task:scheduled ref="taskJob" method="taskGo" cron="0 */1 * * * ?" />
	<!-- 
	
		配置多个任务调度的话,就直接继续在里面添加配置即可:
	   
		<task:scheduled ref="taskStatisticsA" method="statisticsGo" cron="0 */1 * * * ?" />
		<task:scheduled ref="taskStatisticsB" method="statisticsGo" cron="0 */1 * * * ?" />
		<task:scheduled ref="taskStatisticsC" method="statisticsGo" cron="0 */1 * * * ?" />
		
	-->
</task:scheduled-tasks>

Java代码:

package com.baikeyang.task;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * @Project: Demo
 * @Description: ${TODO}
 * @Package: com.baikeyang.task
 * @Class: ${FILE_NAME}
 * @See:
 * @Author: baikeyang@vip.qq.com
 * @DateTime: 2018/3/28 10:31
 * @ComputerUser: ${user}
 * @Version: v1.0.0
 * @CopyRight: 2018
 */
@Component(value = "taskJob")
public class TaskJob{

    protected Logger log = LoggerFactory.getLogger(TaskJob.class);

    @Scheduled
    public void taskGo(){
        log.info("Task Job 开始执行啦…………………………………………………………………………");
    }

}

怎么样?有没有很简单?好了。这个就是Spring任务调度@Scheduled的外部配置方法,配置方法也比较简单,在这里也就不过多的说了。

 

标签: Spring, Scheduled, Spring Task, Spring Task定时任务, Spring任务调度

添加新评论