在使用过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的外部配置方法,配置方法也比较简单,在这里也就不过多的说了。