基於SpringMvc的定時任務設計與踩的坑
阿新 • • 發佈:2019-01-08
需求:系統內有個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沒有注入成功