我想实现一个点时器,于是使用Listener在web工程启动时开始计时启动,可是每次启动定时器后进入MyTask调度任务后总是不执行任务,我的任务暂时让它打印到控制台一条提示语句,可是我加断点调试发现每次都不执行控制台输出语句而之间结束任务,这是为什么呢,如下代码...添加一个定时器:
package timer;import java.util.Timer;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServlet;public class ContextListenerextends HttpServletimplements ServletContextListener { public ContextListener() { } private java.util.Timer timer = null; public void contextInitialized(ServletContextEvent event) { event.getServletContext().log("定时器已启动");
timer.schedule(new MyTask(event.getServletContext()), 0, 600);
event.getServletContext().log("已经添加任务调度表"); } public void contextDestroyed(ServletContextEvent event) { timer.cancel(); event.getServletContext().log("定时器销毁"); }}
MyTask任务的实现
package timer;import java.util.Calendar;
import java.util.TimerTask;import javax.servlet.ServletContext;public class MyTask extends TimerTask {
private static boolean isRunning = false; private static final int C_SCHEDULE_HOUR = 9; private ServletContext context = null; public MyTask() { } public MyTask(ServletContext context) {
this.context = context;
} @Override
public void run() {
Calendar cal = Calendar.getInstance();
if (!isRunning) {
if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {
isRunning = true;
context.log("开始执行指定任务");
System.out.print("任务开始");
isRunning = false;
context.log("指定任务执行结束");
}
} else {
context.log("上一次任务执行还未结束");
}
}
}
web里的Listener配置
<listener>
<listener-class>timer.ContextListener</listener-class>
</listener>
这是执行后的结果
[09:51:19.484] WebApp[http://localhost:8082/resin-doc] starting
[09:51:19.656] WebApp[http://localhost:8082/timer] starting
[09:51:19.656] 定时器已启动
[09:51:19.656] 已经添加任务调度表
[09:51:19.953] action: init
[09:51:20.046] Initializing, config='org.apache.struts.util.LocalStrings', returnNull=true
[09:51:20.046] Initializing, config='org.apache.struts.action.ActionResources', returnNull=true
[09:51:21.000] Initializing, config='com.yourcompany.struts.ApplicationResources', returnNull=true
[09:51:21.140] WebApp[http://localhost:8082/resin-admin] starting
[09:51:21.187] http listening to *:8082
[09:51:21.187] Resin started in 4922msrun方法里的两个条件都符合,都能判断进入,就是不执行
“context.log("开始执行指定任务");
System.out.print("任务开始");
isRunning = false;
context.log("指定任务执行结束");
”,
大侠们帮忙看看,我哪里出错了
package timer;import java.util.Timer;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServlet;public class ContextListenerextends HttpServletimplements ServletContextListener { public ContextListener() { } private java.util.Timer timer = null; public void contextInitialized(ServletContextEvent event) { event.getServletContext().log("定时器已启动");
timer.schedule(new MyTask(event.getServletContext()), 0, 600);
event.getServletContext().log("已经添加任务调度表"); } public void contextDestroyed(ServletContextEvent event) { timer.cancel(); event.getServletContext().log("定时器销毁"); }}
MyTask任务的实现
package timer;import java.util.Calendar;
import java.util.TimerTask;import javax.servlet.ServletContext;public class MyTask extends TimerTask {
private static boolean isRunning = false; private static final int C_SCHEDULE_HOUR = 9; private ServletContext context = null; public MyTask() { } public MyTask(ServletContext context) {
this.context = context;
} @Override
public void run() {
Calendar cal = Calendar.getInstance();
if (!isRunning) {
if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {
isRunning = true;
context.log("开始执行指定任务");
System.out.print("任务开始");
isRunning = false;
context.log("指定任务执行结束");
}
} else {
context.log("上一次任务执行还未结束");
}
}
}
web里的Listener配置
<listener>
<listener-class>timer.ContextListener</listener-class>
</listener>
这是执行后的结果
[09:51:19.484] WebApp[http://localhost:8082/resin-doc] starting
[09:51:19.656] WebApp[http://localhost:8082/timer] starting
[09:51:19.656] 定时器已启动
[09:51:19.656] 已经添加任务调度表
[09:51:19.953] action: init
[09:51:20.046] Initializing, config='org.apache.struts.util.LocalStrings', returnNull=true
[09:51:20.046] Initializing, config='org.apache.struts.action.ActionResources', returnNull=true
[09:51:21.000] Initializing, config='com.yourcompany.struts.ApplicationResources', returnNull=true
[09:51:21.140] WebApp[http://localhost:8082/resin-admin] starting
[09:51:21.187] http listening to *:8082
[09:51:21.187] Resin started in 4922msrun方法里的两个条件都符合,都能判断进入,就是不执行
“context.log("开始执行指定任务");
System.out.print("任务开始");
isRunning = false;
context.log("指定任务执行结束");
”,
大侠们帮忙看看,我哪里出错了
System.out.print("任务开始");
isRunning = false;
context.log("指定任务执行结束");
”,
每次到context.log("开始执行指定任务");就直接跳出结束整个run方法
就直接结束run方法
然后现在的问题我不明白。可以做一个servlet重写它的init()方法,来调用你的TimerTask主程序。
例如:在web.xml中配置 <servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>Log4jServlet</servlet-name>
<servlet-class>com.test.servlet.Log4jServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>加入load-on-startup使得在web应用开启时自动执行。至于timetask类你怎么设计看自己了
private java.util.Timer timer = null;这个是不是改成private java.util.Timer timer = new Timer();其次我感觉你的run方法写的有错误
你觉得我run方法里哪里有错误,你尽管说,我都试试,谢谢了
package org.servlet;public class Job1 {
public void work(){
System.out.println("job1 work");
}
}
package org.servlet;import java.util.Calendar;
import java.util.TimerTask;public class JobTimerTask extends TimerTask{ int hour = 13;
@Override
public void run() {
// TODO Auto-generated method stub
Calendar now = Calendar.getInstance();
if(hour==now.get(Calendar.HOUR_OF_DAY)){
Job1 j = new Job1();
j.work();
}
}
}
package org.servlet;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Timer;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class TimerTaskServlet extends HttpServlet { /**
* Constructor of the object.
*/
public TimerTaskServlet() {
super();
} /**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
} public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
} /**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
// Put your code here
Timer t = new Timer();
JobTimerTask jt = new JobTimerTask();
long delay = 1000;
long period = 1000*60;
t.schedule(jt, delay, period);
}}将servlet设置load-on-startup为1
你可以了解下。