spring监听器


当Tomcat重启之后,如何让Spring 重新启动任务呢?其中使用的quartz任务调度框架。

最后更新时间: 2019-01-04 10:34:50

创建一个SchedulerInitListener监听器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class SchedulerInitListener implements ApplicationListener<ContextRefreshedEvent>{

// 在任务表中,加入状态字段,其中值为 Y 或 N
private static final String STATUS_USABLE = "Y";
// 拼接要执行的类
private static final String PACKAGE = "com.flyme.job.";
private static final Logger log = LoggerFactory.getLogger(SchedulerInitListener.class);

@Autowired
private IAuditScheduleJobService auditScheduleService;

/**
* @param jobName 任务名
* @param jobGroupName 任务组名
* @param triggerName 触发器名
* @param triggerGroupName 触发器组名
* @param jobClass class
* @param cron 时间设置
*/
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
//只执行一次
if(event.getApplicationContext().getParent() ==null){
List<Map<String, Object>>
// 进行查询数据库,返回list对象
scheduleList=auditScheduleService.queryAuditSchedule();
if(scheduleList.size()>0){
for(Map<String, Object> map:scheduleList){
//启动所有可用的定时调度任务
if(STATUS_USABLE.equals(map.get("STATUS"))){
try {
//反射获取指定要运作的class
Class<String> schedulerClass=(Class<String>) Class.forName(PACKAGE+(String)map.get("JOB_CLASS"));
SchedulerManager.addJob((String)map.get("JOB_NAME"),
(String)map.get("JOB_GROUP_NAME"), (String)map.get("TRIGGER_NAME"),
(String)map.get("TRIGGER_GROUP_NAME"), schedulerClass, (String)map.get("CRON"));
} catch (Exception e) {
log.error("任务:"+(String)map.get("JOB_NAME")+"启动失败,失败原因是:"+e.getMessage(),e);
}
}
}
}
}
}

}

在applicationContext-dao.xml中加入SchedulerInitListener监听器bean对象

1
2
<!-- 当Spring容器启动完成后执行下面的这个Bean -->
<bean class="com.flyme.listener.SchedulerInitListener"></bean>