jee中实现定时执行
编写一个监听器,并在web.xml中注册.
package com.backup.listener;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class AppListener implements ServletContextListener{
?? ?private Timer timer=null;???
?? ?public void contextDestroyed(ServletContextEvent event) {
?? ??? ?if(timer!=null){
?? ??? ??? ?timer.cancel();
?? ??? ?}
?? ??? ?event.getServletContext().log("定时器销毁");
?? ?}
?? ?public void contextInitialized(ServletContextEvent event) {
?? ??? ?timer?? =?? new?? java.util.Timer(true);??? ?
?? ??? ?event.getServletContext().log("定时器已启动");
?? ??? ?timer.schedule(new MyTask(event.getServletContext()),0,1000);??? ?
?? ??? ?event.getServletContext().log("已经添加任务调度表");
?? ?}
}
TimerTask类:
package com.backup.listener;
import java.util.Calendar;
import java.util.Date;
import java.util.TimerTask;
import javax.servlet.ServletContext;
public class MyTask extends TimerTask {
??? private static final int C_SCHEDULE_HOUR = 0;
??? private static boolean isRunning = false;
??? private ServletContext context = null;
??? public static boolean isSunday=false;
??? public MyTask(ServletContext context) {
??? ??? this.context = context;
??? }
??? public?? void?? run(){
??? ?? context.log("看一看是不是不断的执行");
?????????? Calendar?? cal?? =?? Calendar.getInstance();
?????????? if(!isRunning){????
??????? ??? ?System.err.println("开始执行任务");
?????????????? if(C_SCHEDULE_HOUR?? ==?? cal.get(Calendar.HOUR_OF_DAY))?? {
??????????? ??? ?????? isRunning?? =?? true;????????????????????????????????????
?????????????????????? context.log("开始执行指定任务");????
??????????????????????????
?????????????????????? //TODO?? 添加自定义的详细任务,以下只是示例????
?????????????????????? int?? i?? =?? 0;????
?????????????????????? while?? (i++?? <?? 10)?? {????
?????????????????????????????? context.log("已完成任务的"?? +?? i?? +?? "/"?? +?? 10);????
?????????????????????? }????
?????????????????????? isRunning? =? false;????
?????????????????????? context.log("指定任务执行结束");
??????????? ??? ?? }
?????????? }else{????
??????????????? context.log("上一次任务执行还未结束");????
?????????? }????
???? }????
}
从网上找的也不错:
web.xml
<servlet >
???? <servlet-name >taskservlet</servlet-name >
??? <servlet-class >common.timer.ConvergeDataServlet</servlet-class >
??? <init-param >
???? <param-name >startTask</param-name >
???? <param-value >true</param-value >
??? </init-param >
??? <init-param >
???? <param-name >intervalTime</param-name >
???? <param-value >240</param-value >
??? </init-param >
??? <load-on-startup >300</load-on-startup >
</servlet >
?
ConvergeDataServlet.java
package common.timer;
import java.io.IOException;
import java.util.Timer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ConvergeDataServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
private Timer timer1 = null;
private Task task1;
/**??
* Constructor of the object.??
*/
public ConvergeDataServlet() {
?? super();
}
/**??
* Destruction of the servlet.
*/
public void destroy() {
?? super.destroy();
?? if (timer1 != null) {
??? timer1.cancel();
?? }
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
??? throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
??? throws ServletException, IOException {
?? doGet(request, response);
}
// init方法启动定时器???
public void init() throws ServletException {
?? ServletContext context = getServletContext();
?? // (true为用定时间刷新缓存)???
?? String startTask = getInitParameter("startTask");
?? // 定时刷新时间(分钟)???
?? Long delay = Long.parseLong(getInitParameter("intervalTime")) * 60 * 1000;
?? // 启动定时器???
?? if (startTask.equals("true")) {
??? timer1 = new Timer(true);
??? task1 = new Task(context);
??? timer1.schedule(task1, delay, delay);
?? }
}
}
Task.java
package common.timer;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.TimerTask;
import javax.servlet.ServletContext;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import tobacco.dayreport.DayreportDAO;
import tobacco.template.service.TobaccoDAOFactory;
public class Task extends TimerTask {
private Logger logger = LogManager.getLogger(Task.class);
private ServletContext context;
private static boolean isRunning = true;
public Task(ServletContext context) {
?? this.context = context;
}
public Task() {
}
@Override
public void run() {
?? Date d = new Date();
?? if (isRunning) {
?? }
??
?? DayreportDAO dao = (DayreportDAO) TobaccoDAOFactory.getDAO("Dayreport");
?? try {
??? Timestamp t = new Timestamp(d.getTime());
??? dao.dayReports(t);
??? logger.debug("=========== 汇总被执行 ==========" + d.toString());
???
?? } catch (SQLException ex) {
??? ex.printStackTrace();
?? }
}
}
?
?
------------------------------------------------------
Java定时任务的实现?
?
来自:http://love-love-l.blog.163.com/blog/static/2107830420089151561835/
?
?