Spring 监听器定义两个定时器在同一时间重复执行两次,实际上Spring监听器ApplicationListener执行了3遍

bubblehead 发布于 2016/10/21 10:16
阅读 2K+
收藏 0

Spring+hibernate定义两个定时器在同一时间重复执行两次,是因为使用了两个定时器导致线程紊乱了吗?在Web程序启动的时候会同时执行两个定时器

public void onApplicationEvent(ContextRefreshedEvent arg0) {
    TimerTask task =new TimerTask(){
        @Override
        public void run() {
            //定时内容 }
}
两个定时器都是这样写的,现在出现这样的问题

另外还想知道,一个Application如何加载多个定时任务

刚刚试了,写到一个OnApplicationEvent(){}中解决不了问题,Spring监听器ApplicationListener执行了3遍


加载中
0
bubblehead
bubblehead

问题已解决:

@Override
	public void onApplicationEvent(ContextRefreshedEvent event) {
		try{
		if(event.getSource() instanceof XmlWebApplicationContext){
			if(((XmlWebApplicationContext)event.getSource()).getDisplayName().equals("Root WebApplicationContext")){
   //TimerTask
}}}catch(Exception e){
    log4j.error("((XmlWebApplicationContext) applicationEvent.getSource()).getDisplayName() 执行失败,请检查Spring版本是否支持");
}



2
妹子楼顶有鸽子
妹子楼顶有鸽子
event.getSource().getParent() == null  
0
bubblehead
bubblehead

这里对问题进行一下说明:


在一个类里面实现了 ApplicationListener 接口,用于在初始化完成后做定时任务TimerTask,但是通过log4j打印日志,发现它执行了3次,其中一次是Spring 框架初始化时执行,另外两次是在项目启动成功后,加载Spring-MVC时执行的。

通过打 breakpoint看到,这两次执行中,onApplicationEvent(ContextRefreshdEvent event)方法中的 event对象值不同,第一次是 Root WebApplicationContext , 据此可以根据对象值来告诉定时器只执行一次即可


返回顶部
顶部