之前一直使用Quartz定时调度框架,感觉其配置起来太繁锁,近期决定采用Spring-Task作为任务调度框架,因为其配置简单,灵活,易维护的特点。具体使用步骤如下:
在之前的spring.xml文件中增加配置项,在<beans>中增加如下配置项:
<beans
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
在beans节点里如下配置项:
<!-- 自动扫描包 -->
<context:component-scan base-package="com.hp.*.timer" />
<!-- 如采用注解方式,则需配置此项 -->
<task:annotation-driven scheduler="myScheduler"/><!-- 启用注解驱动的定时任务 -->
<task:scheduler id="myScheduler" pool-size="5"/><!-- 配置定时任务的线程池(多线程时配置此项))-->
<!-- 配置定时任务时间(如采用注解方式,则无需配置此项) -->
<task:scheduled-tasks>
<task:scheduled ref="openAccJob" method="execute" cron="0 0/1 * * * ?"/>
</task:scheduled-tasks>
说明:1、理论上只需加上<task:annotation-driven />就可以了,参数都不是必须的;
2、ref指定的即任务类,method指定的即需要运行的方法,cron表达式与quartz一样。
定时任务调度类(配置形式),代码如下:
package com.hp.pay.timer;
/**
* 查询服务
*
* @author Tom.Liao
* @date 2018-03-20
* @version 1.0.0
*/
@Service
public class OpenAccJob {
private static final Logger log = Logger.getLogger(OpenAccJob.class);
/**
* 定时调度入口
*/
public void execute() {
log.info("openAcc query job startTime:" + DateUtils.getCurrentDate("yyyy-MM-dd HH:mm:ss"));
try {
/// 此处代码省略
} catch (Exception e) {
log.error("查询时出错:" + e.getMessage(), e);
}
log.info("openAcc query job endTime:" + DateUtils.getCurrentDate("yyyy-MM-dd HH:mm:ss"));
}
}
定时任务调度类(注解形式),代码如下
package com.hp.pay.timer;
/**
* 查询服务
*
* @author Tom.Liao
* @date 2018-03-20
* @version 1.0.0
*/
@Component(“openAccJob”)
public class OpenAccJob {
private static final Logger log = Logger.getLogger(OpenAccJob.class);
/**
* 定时调度入口
*/
@Scheduled(cron = "0 0/1 * * * ?")
public void execute() {
log.info("openAcc query job startTime:" + DateUtils.getCurrentDate("yyyy-MM-dd HH:mm:ss"));
try {
/// 此处代码省略
} catch (Exception e) {
log.error("查询时出错:" + e.getMessage(), e);
}
log.info("openAcc query job endTime:" + DateUtils.getCurrentDate("yyyy-MM-dd HH:mm:ss"));
}
}
但Spring-Task不支持分布式,分布式定时调度还得用 quartz,开源的分布式任务调度框架有:opencron,LTS,XXL-JOB 和 Elastic-Job 等。
网友评论