首页 新闻 赞助 找找看

Java用timer做成的定时器 同一时间 执行了两次,生成重复的数据!有大神遇到过么?

0
悬赏园豆:5 [已解决问题] 解决于 2018-06-22 15:56

多的不解释,就是一个timer定时器,这个类再web.xml里注入的,类的代码如下:

public class ZyrzCallOutTaskTimerAction implements ServletContextListener
{

final Logger logger = Logger.getLogger(ZyrzCallOutTaskTimerAction.class);
private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;//5*60*1000;
private Timer timer = null;
private Timer timer400 = null;

@Override
public void contextDestroyed(ServletContextEvent event)
{
if (timer != null)
{
timer.cancel();
timer400.cancel();
}
event.getServletContext().log("定时器已销毁");
logger.info("定时器已销毁");
}

@Override
public void contextInitialized(ServletContextEvent arg0)
{

WebApplicationContext webapp = WebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext());

ISystemConfigService config = (ISystemConfigService) webapp.getBean("systemConfigService");
IZyrzCallOutProjectDao projectDao = (IZyrzCallOutProjectDao) webapp.getBean("zyrzCallOutProjectDao");
IOperatorDao dao = (IOperatorDao) webapp.getBean("operatorDao");
IZyrzCallOutProjectService projectService = (IZyrzCallOutProjectService) webapp
.getBean("zyrzCallOutProjectService");
IZyrzCallOutTaskService taskService = (IZyrzCallOutTaskService) webapp
.getBean("zyrzCallOutTaskService");
String projectType = config.findByItemNameGatValue("PROJECT_NAME");
if ("zyrz".equals(projectType))
{// 在系统管理-》配置管理页面 找到 PROJECT_NAME这条数据 将配置项值改成zyrz 重启服务即可运行此定时器
timer = new Timer(true);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 2); // 设置时
calendar.set(Calendar.MINUTE, 0); // 设置分
calendar.set(Calendar.SECOND, 0);
Date firstTime = calendar.getTime(); // 第一次执行定时任务的时间
// 如果第一次执行定时任务的时间 小于当前的时间,此时要在
// 第一次执行定时任务的时间加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
if (firstTime.before(new Date()))
{
calendar.add(Calendar.DAY_OF_MONTH, 1);
firstTime = calendar.getTime();
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
logger.info("第一次执行时间为:" + sdf.format(firstTime));
// 设置任务调度类,第一次执行时间,间隔时间
ZyrzCallOutTimeTask a = new ZyrzCallOutTimeTask(projectDao, dao, projectService);
timer.schedule(a, firstTime, PERIOD_DAY);
logger.info("已添加任务");

timer400=new Timer(true);
ZyrzCallOut400TimeTask task=new ZyrzCallOut400TimeTask(projectDao,dao,projectService,taskService);
timer400.schedule(task, firstTime, PERIOD_DAY);
logger.info("已添加任务");

}
else
{
logger.info("不执行此定时器!");
}

}

}

问题补充:

找到了原因,服务器上项目部署在tomcat的webapps文件下面,conf下的server.xml里面又配置了一句<Context .../>  指向tomcat的webapps下的项目,这样启动的时候web.xml里面的定时监听执行了2次.就是上面 那位哥哥说的 "先在contextInitialized里打印一下看看你的listern进去了几次" ,这样的情况会进去2次. 
问题原因找到了.新的问题出来了tomcat conf下的server.xml配置了<Context .../> 是运维的同事想要给项目分个域名. 可以在不修改定时器实现方式,不删除<Context .../>的情况下提供解决方案吗.

^keepHungry$的主页 ^keepHungry$ | 小虾三级 | 园豆:516
提问于:2018-05-31 15:11
< >
分享
最佳答案
0

已解决,tomcat中设置了外网访问导致的

^keepHungry$ | 小虾三级 |园豆:516 | 2018-06-22 15:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册