1. 程式人生 > >基於SpringMvc的定時任務設計與踩的坑

基於SpringMvc的定時任務設計與踩的坑

需求:系統內有個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沒有注入成功