关于Spring任务调度@Scheduled的外部配置方法
在使用过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的外部配置方法,配置方法也比较简单,在这里也就不过多的说了。