基于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没有注入成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值