Spring 定时任务实现 以及没法正常执行分析spring
背景:使用quartz时客户现场不知道为何跑着跑着就停了,后来决定换成spring定时任务。app
按道理使用spring 定时任务应该是很简单的,不过仍是踩到一些坑,下面记录过程并逐一分析说明,供之后参考;ide
一、使用注解的形式完成执行定时任务spa
1.1 applicationContext.xml中要包含对类扫描声明,以及开启task定时任务注解声明(以下)debug
<context:component-scan base-package="com.carnation" />component
<task:annotation-driven />orm
1.2 完成本身的task相关类,并作配置以下xml
@Componentget
@Lazy(false) //当application.xml中default-lazy-init="true"时,这里lazy必须是falseit
@EnableScheduling
public class HeBeiTask1 {
@Scheduled(cron = "0 0/2 * * * ?")
public void doTask(){
。。。。。。
doMyJob();
}
private void doMyJob(){
。。。。。。
}
}
1.3 踩坑记录-没法正常执行
(1)若是在spring中配置了default-lazy-init="true"的话,这里必定要有@Lazy(false),不然不执行;
(2)若是使用spring4 的话,听说@EnableScheduling必需要加上,不然也可能不执行(spring3 是不须要的);
(3)定时方法上@Scheduled的配置,及cron表达式的正确性
(4)固然最基础的一点是你的类必定要能被spring管理到(@Component)
二、使用xml配置的形式完成执行定时任务
2.1 applicationContext.xml中要包含任务类的注册,并配置task:scheduled-tasks及task:scheduled,参考以下
<bean name="stdTask1" class="com.carnation.quartz.HeBeiTask1" lazy-init="false"></bean> <!--看状况分析这里是否要有lazy-init="false"-->
<bean name="stdTask2" class="com.carnation.quartz.HeBeiTask2" lazy-init="false"></bean>
<bean name="stdTask3" class="com.carnation.quartz.HeBeiTask3" lazy-init="false"></bean>
<task:scheduled-tasks>
<task:scheduled ref="stdTask1" method="doTask" cron="0 0/2 * * * ?"/>
<task:scheduled ref="stdTask2" method="doTask" cron="0 0/5 * * * ?"/>
<task:scheduled ref="stdTask3" method="doTask" cron="0 0/2 * * * ?"/>
</task:scheduled-tasks>
2.2 完成本身的task相关类,很是简单参考以下:
public class HeBeiTask2 {
private Logger logger = Logger.getLogger(HeBeiTask2.class);
@Autowired
StandardColumnService standardColumnService;
public void doTask(){
try {
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
logger.debug(sdf.format(new Date())+" HeiBeiTask-2 for SyncMetaDataJob1 开始执行");
doMyJob();
} catch (Exception e) {
logger.error("HeiBeiTask2异常",e);
}
}
private void doMyJob(){
。。。。。。
}
2.3 踩坑记录-没法正常执行
若是在spring中配置了default-lazy-init="true"的话,这里必定要有lazy-init="false",不然不执行;
到此,spring定时任务就算是完成了,两种方法都可正常运行。
但出现问题了,在执行的时候发现会有重复执行的问题。