博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
服务器启动完成执行定时任务Timer,TimerTask
阅读量:5306 次
发布时间:2019-06-14

本文共 2827 字,大约阅读时间需要 9 分钟。

由于项目需求:每隔一段时间就要调外部接口去进行某些操作,于是在网上找了一些资料,用了半天时间弄好了,代码:

1 import java.util.TimerTask;2 3 public class AccountTask extends TimerTask {4     5     @Override6     public void run() { 7         System.out.prinln("开始执行定时任务业务");8     }9 }

 

1 import java.util.Timer; 2  3 import javax.servlet.ServletContextEvent; 4 import javax.servlet.ServletContextListener; 5  6 public class AccountTimerListener implements ServletContextListener { 7  8     private Timer timer = null; 9 10     @Override11     public void contextInitialized(ServletContextEvent event) {12         timer = new Timer(true);13         event.getServletContext().log("定时器已启动");14         // 服务器启动后,延迟7秒启动,5秒执行一次15         timer.scheduleAtFixedRate(new AccountTask(), 7 * 1000, 5 * 1000);16     }17 18     @Override19     public void contextDestroyed(ServletContextEvent event) {20         if (timer != null) {21             timer.cancel();22             event.getServletContext().log("定时器销毁");23         }24     }25 }

然后在web.xml文件中配置监听

1     
2
com.xxx.AccountTimerListener
3

启动之后,会发现没隔5秒打印一次: 开始执行定时任务业务 。

然而,当调度类中调用service层业务时,启动tomcat后,执行定时任务时会报空指针异常,这是由于这个定时任务目前只是一个普通的类,我们需要将这个定时任务注入到spring中,监听。

解决方案如下:

1 package com.test.utils; 2  3 import javax.servlet.ServletContextEvent; 4 import javax.servlet.ServletContextListener; 5  6 import org.springframework.context.ApplicationContext; 7 import org.springframework.web.context.WebApplicationContext; 8 import org.springframework.web.context.support.WebApplicationContextUtils; 9 10 public class SpringInit implements ServletContextListener {11 12     private static WebApplicationContext springContext;13 14     public SpringInit() {15         super();16     }17 18     @Override19     public void contextDestroyed(ServletContextEvent event) {20         // TODO Auto-generated method stub21     }22 23     @Override24     public void contextInitialized(ServletContextEvent event) {25         springContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());26     }27 28     public static ApplicationContext getApplicationContext() {29         return springContext;30 31     }32 33 }

web.xml文件:

1 
2
3 4 5
6
com.test.utils.SpringInit
7

若  context:component-scan  出报错,可能是因为没有引入标签。

在xmlns:xsi 里加上  

1 http://www.springmodules.org/schema/cache/springmodules-cache.xsd http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd

xsi:schemaLocation里加上  

1  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

上面的问题解决。

最后,我们掉用service之前,这样来获取bean:

DetailService detailService = (DetailService) SpringInit.getApplicationContext().getBean("detailService");

然后就可以掉用service层业务进行定时任务了。

 

转载于:https://www.cnblogs.com/wdpnodecodes/p/8025134.html

你可能感兴趣的文章
mybatis整合spring
查看>>
HttpProxyCacheServer (音视频缓存框架)
查看>>
关于测试文档的编写
查看>>
2018-2019-1 20189215《Linux内核原理与分析》第五周作业
查看>>
ubuntu 16.04 忘记root密码的处理方法
查看>>
Linux下错误的捕获:全局变量errno和strerror()
查看>>
js return无效,表单自动提交
查看>>
verilog case 语句合并问题
查看>>
python3.4 使用BeautifulSoup问题
查看>>
ASCII、Unicode和UTF-8等常见字符编码格式介绍
查看>>
英文自动换行的解决方法
查看>>
python-列表解析、字典解析、集合解析
查看>>
作为互联网初创公司,应该具备的条件(一):概述
查看>>
安卓ROOT工具汇总
查看>>
大臣的旅费
查看>>
20180101
查看>>
查看SQL SERVER Job details
查看>>
ts关键还是js 因为要编译成js
查看>>
南阳56
查看>>
基于android studio的快捷开发(将持续更新)
查看>>