需求:系统内有个sla计时器需要每隔一分钟执行一次
思路:项目启动的时候将sla定时任务存入数据库并调用定时任务群启动方法完成
配置系统启动Listener
<listener>
<listener-class>com.dc.itsm.web.MyContextLoaderListener</listener-class>
</listener>
写系统启动监听类,继承ContextLoaderListener 就可以在系统启动完成调用contextInitialized方法,
createSlaTaskOper()方法中初始化sla定时任务数据到数据库
public class MyContextLoaderListener extends ContextLoaderListener {
private static final Logger log = LoggerFactory.getLogger(MyContextLoaderListener.class);
public MyContextLoaderListener() {
}
public MyContextLoaderListener(WebApplicationContext context) {
super(context);
}
/**
* Initialize the root web application context.
*/
@Override
public void contextInitialized(ServletContextEvent event) {
initWebApplicationContext(event.getServletContext());
log.info("=======系统启动成功=====");
try {
//创建sla定时任务
SlaTaskService attendTimerTask = ContextHolder.getBean(SlaTaskService.class);
attendTimerTask.createSlaTaskOper();
//开启所有定时任务
ClusterQuartzManager.startAll();
} catch (SchedulerException e) {
e.printStackTrace();
log.error("=======定时任务初始化失败=====");
}
}
/**
* Close the root web application context.
*/
@Override
public void contextDestroyed(ServletContextEvent event) {
super.contextDestroyed(event);
}
}
ClusterQuartzManager.startAll();是启动所有定时任务的方法
这里在写sla定时任务的excute()方法的时候,需要实现SchedulerjobBean接口 。
踩过的坑:
1.在调用初始化sla定时任务数据时,报 securityManager的错误
经一顿推到发现listener优先于 filter加载 导致shiro还没有加载就要请求登录人信息
2.ContextHolder.getBean(SlaTaskService.class); 这个方法在正常情况下还是尽量少用,
很容易出现找不到的问题,就是这个class没有注入成功