您的位置:首页 > 编程语言 > Java开发

基于SpringMvc的定时任务设计与踩的坑

2017-02-11 14:35 267 查看
需求:系统内有个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没有注入成功
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计