-----汗。。刚才发到J2SE区去了!
首先,说明下需求,我在tomcat启动的时候,就加载这一监听,然后希望在早上9点的时候,定时执行某一程序。下面是代码部分.
Java code
public class ContextListener extends HttpServlet implements
ServletContextListener { /**
*
*/
private static final long serialVersionUID = 1L; public ContextListener() { } private java.util.Timer timer = null; public void contextInitialized(ServletContextEvent event) { timer = new java.util.Timer(true);
event.getServletContext().log("定时器已启动");
Calendar cal=Calendar.getInstance(); //设置时间为9点
cal.set(Calendar.HOUR_OF_DAY, 9);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND,0);
//System.out.println(cal.getTime()) ;
//今天是2009-11-20,打印的结果:Fri Nov 20 09:00:00 CST 2009
timer.schedule(new AutoSendMessage(event.getServletContext()), cal.getTime(),
24 * 60* 60 * 1000l);
event.getServletContext().log("已经添加任务调度表");
} public void contextDestroyed(ServletContextEvent event) { timer.cancel(); event.getServletContext().log("定时器销毁"); }}
方法schedule(TimerTask task, Date firstTime, long period) 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
在AutoSendMessage中实现TimerTask,可以理解成一个简单的输出语句。 问题就是:代码中,红色的部分, cal.Time()是第一次执行的时间, 24 * 60* 60 * 1000l间隔24小时。
那么现在时间是 2009-11-20 15:25:00, 我的期望是不执行,因为现在不是早上9点。
但是AutoSendMessage中的方法,还是执行了。 这是什么原因???还有,应该怎样修改,才能和期望一样,每天早上执行??我随时都可能要重启服务器,tomcat启动的时候,就会进入ContextListener
首先,说明下需求,我在tomcat启动的时候,就加载这一监听,然后希望在早上9点的时候,定时执行某一程序。下面是代码部分.
Java code
public class ContextListener extends HttpServlet implements
ServletContextListener { /**
*
*/
private static final long serialVersionUID = 1L; public ContextListener() { } private java.util.Timer timer = null; public void contextInitialized(ServletContextEvent event) { timer = new java.util.Timer(true);
event.getServletContext().log("定时器已启动");
Calendar cal=Calendar.getInstance(); //设置时间为9点
cal.set(Calendar.HOUR_OF_DAY, 9);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND,0);
//System.out.println(cal.getTime()) ;
//今天是2009-11-20,打印的结果:Fri Nov 20 09:00:00 CST 2009
timer.schedule(new AutoSendMessage(event.getServletContext()), cal.getTime(),
24 * 60* 60 * 1000l);
event.getServletContext().log("已经添加任务调度表");
} public void contextDestroyed(ServletContextEvent event) { timer.cancel(); event.getServletContext().log("定时器销毁"); }}
方法schedule(TimerTask task, Date firstTime, long period) 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
在AutoSendMessage中实现TimerTask,可以理解成一个简单的输出语句。 问题就是:代码中,红色的部分, cal.Time()是第一次执行的时间, 24 * 60* 60 * 1000l间隔24小时。
那么现在时间是 2009-11-20 15:25:00, 我的期望是不执行,因为现在不是早上9点。
但是AutoSendMessage中的方法,还是执行了。 这是什么原因???还有,应该怎样修改,才能和期望一样,每天早上执行??我随时都可能要重启服务器,tomcat启动的时候,就会进入ContextListener
解决方案 »
- 关于s:iterator 为什么页面显示不了结果,控制台也有结果输出~~还有,怎么把这个迭代放到select的option中?求教。。。
- Unable to instantiate Action
- 请求高手解决:有关weblogic的问题
- jstl标签出现怪问题,请熟悉的人帮我看下
- java串口通信错误
- 在eclipse+jboss-ide1.4+jboss4.0.0下jboss4.0.0不能启动,出现下面的错误,是什么原因,希望大家看看也许以后你会碰到?
- [求助]Java检查求解!急!
- !!!tomcat中怎么让别的盘成为它的一个虚拟目录???
- 有STRUTS项目经验的请看!!??
- 怎样通过DOM机制创建XML文档?
- 在servlet 中获取当前项目的存放路径
- 怎么才能输出信息
Calendar cal=Calendar.getInstance();//设置时间为9点 cal.set(Calendar.HOUR_OF_DAY,9);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
在程序当中,我如果设置时间为当前时间的后面,比如说,现在是16:00,cal.set(Calendar.HOUR_OF_DAY, 17); 那么到了17:00的时候,就到了第一次执行时间,这样就没问题!问题是,我现在都已经过了9点,我启动tomcat,他就直接执行了。。不懂!!
//把这段加在你红字的前边
synchronized (this) {
Date d1 = new Date();
if(d1.getHours()>9)
{
System.out.println("过9点了");
}
//new一个第2天9点的时间,你可以写个更好的
Date d2 = new Date();
d2.setDate(d2.getDate()+1);
d2.setHours(9);
d2.setMinutes(0);
d2.setSeconds(0);
long i = d2.getTime()-d1.getTime();//离第2天9点差的毫秒数
System.out.println(i);
wait(i);//等待这个毫秒数,之后再执行你的程序
}