因为项目要求,要创建一个定时器来一段时间监听有没有信息被发布,所以每次都是部署完一个项目之后手动启动定时器,之后发现每次部署都要手动启动,所以决定把它改成随项目启动而启动,一开始百度用的是这两种方法。
注:http://jingyan.baidu.com/article/359911f5518d7457fe0306f9.html
这种方法,这种方法确实可以执行,不过因为我要在这个方法里边用到spring注入的dao,所以,每次运行项目都会报 空指针 异常,所以调试了N遍,以为自己注入的有问题,然后决定试第二种方法;
第二种是这个样子的,就是一个servlet 然后设置了启动顺序,,,这种方法是这个样子,确实也能用,不过它运行了3次,一个定时器启动三次是什么概念,而且又一次启动的的时候居然报了 空指针 ,也是空指针,估计是在WEB.XML里配置的时候启动的时候有问题,而当我把XML的配置注释掉之后,还是会运行2次,不过那两次就没什么问题,不过是同时执行,,其实这个位置我有点不理解的就是,,为什么XML都注释掉它还是会自动运行呢?而且还是两次。
是在tomcat部署出现多少ms前运行的,,注入也没有问题,但是同时运行了两次,这个是不能允许出现的,,同时运行两次,导致的是执行任务的时候也会执行两次,会插入数据库两次,问题很严重,于是也是调试了N次,也没解决。
之后搜了下,可能是因为这些方法可能是在spring容器还没有完成初始化的时候就已经执行了,所以导致的问题就是 空指针,初始化两次网上有写,也不知道对不对,说是tomcat问题,http://www.cnblogs.com/feiguo/p/3779192.html 这个是看着还算比较容易理解的,
解决方法如下:
使用onApplicationEvent这个方法就可以,这个方法会在spring的bean全部初始化之后才会执行,所以就完美解决了没有完全初始化的问题,不过类要实现 ApplicationListener
如下
public class onLoad implements ApplicationListener<ContextRefreshedEvent>{}
然后在实现的这个方法里边写自己的代码
public void onApplicationEvent(ContextRefreshedEvent event) {}
判断的话,因为if(event.getApplicationContext().getParent() == null) 这个方法我可以理解,就是root application context 没有parent 所以照理说只会执行一次,不过这里我这边还是执行了两次,估计是那个所说的tomcat问题,然后试了另一种
if(event.getApplicationContext().getDisplayName().equals("Root WebApplicationContext"))
这种方法就只执行了一次,可能是因为spring里root webapplicationContext 只有一个,
定时器的话是这个样子的
Runnable runnable = new Runnable() {
public void run() {
//代码
}
};
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
// 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间,单位是s
service.scheduleAtFixedRate(runnable, 30, 60, TimeUnit.SECONDS);