这个类最终功能是每天某个时间点(如每晚22点)执行某一功能。

首先,介绍java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util. TimerTask)

如: 每隔一个小时执行任务 timer.schedule(TimerTask, 0, 60 * 60 * 1000)。

    schedule方法的第一个参数是需要执行的任务,此类的类型为java.util.TimerTask,

第二个参数为执行任务前等待时间,此处0表示不等待,第三个参数为间隔时间,单位为毫秒。

由于我们希望当Web工程启动时,定时器能自动开始计时,这样在整个Web工程的生命期里,就会定时的执行任务,因此启动定时器的类不能是一般的类,此处用Servlet的监听器类来启动定时器,通过在配置文件里配置此监听器, 让其在工程启动时自动加载运行,存活期为整个Web工程生命期。

 要使用此监听器需要在web.xml中配置,如下:

<!-- 监听器,启动定时器定时提交 -->
	<!-- 监听器类的路径 -->
	<listener>
        <listener-class>com.brilliant.servlet.ContextListener</listener-class>
     </listener>

要运用Servlet侦听器需要实现javax.servlet.ServletContextListener接口,以下是类设计:

package com.brilliant.servlet;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * 监听器的内容
 */
public class ContextListener 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("定时器已启动");

		/**
		 * 定时器到指定的时间时,执行某个操作(如某个类,或方法)
		 */
		//后边最后一个参数代表监视器的监视周期,现在为一分钟
		timer.schedule(new MyTask(event.getServletContext()), 0, 60 * 1000);

		event.getServletContext().log("已经添加任务调度表");
	}

	public void contextDestroyed(ServletContextEvent event) {
		timer.cancel();
		System.out.println("定时器销毁");
		event.getServletContext().log("定时器销毁");
	}

}

 定时器任务

package com.brilliant.servlet;

import java.util.Calendar;
import java.util.TimerTask;

import javax.servlet.ServletContext;

/**
 * 继承 定时器任务类
 * 
 */
public class MyTask extends TimerTask {

	public MyTask() {
		super();
	}

	/** 14:30点钟的时候执行各矿数据强制提交 */
	private static final int C_SCHEDULE_HOUR = 14;
	private static final int C_SCHEDULE_MINUTE = 30;
	/**报表的备份 */
	//private static final int C_SCHEDULE_HOUR = 12;
	//private static final int C_SCHEDULE_MINUTE = 32;
	/** 每个星期给各矿发邮件 */
	//private static final int C_SCHEDULE_HOUR = 12;
	//private static final int C_SCHEDULE_MINUTE = 32;
	private static boolean isRunning = false;

	private ServletContext context = null;

	public MyTask(ServletContext context) {
		this.context = context;
	}

	public void run() {
		Calendar cal = Calendar.getInstance();
		if (!isRunning) {
			System.out.println("当前时间为"+cal.get(Calendar.HOUR_OF_DAY) +":"+cal.get(Calendar.MINUTE));
			if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY) && C_SCHEDULE_MINUTE == cal.get(Calendar.MINUTE)) {
				isRunning = true;
				context.log("开始执行指定任务");

				/**
				 * 此处写执行任务代码
				 */
				// new YouCode().changeState();
				TaskQianXianTiJiao  tj = new TaskQianXianTiJiao();
				String result = tj.tiJiao();
				System.out.println("执行完存储过程后返回值为:  "+result);

				isRunning = false;
				context.log("指定任务执行结束");
			}
		} else {
			context.log("上一次任务执行还未结束");
		}
	}

}

操作类

package com.brilliant.servlet;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import com.brilliant.common.tool.ConversionUtil;
import com.wabacus.config.Config;
import com.wabacus.util.Consts;
/**
 * 
 * @author fph
 * 各矿数据到时间点定时提交
 *
 */

public class TaskQianXianTiJiao {

	/**
	 * Constructor of the object.
	 */
	public TaskQianXianTiJiao() {
		super();
	}




	public String   tiJiao(){

		String result = new String();
		Connection con = Config.getInstance().getDataSource(Consts.DEFAULT_KEY).getConnection();//得到数据库连接
		System.out.println("到servlet这里,准备执行存储过程!");
	 try{
		     //山能生产报表部门有 'product'  'zz1015','zz1020','zz1025','zz1030','zz1035','zz1040','zz1045','zz1060','zz1075','zz1080','zz1235','zz1250','zz1255','zz1260','zz1305'
			 //山能经营报表部门有 'jingying'  'zz1090'
		     //山能置换报表部门有 'zhihuan' 'zz1040','zz1250'
			 //A1的四项          'sixiangday'     'zz1015','zz1020','zz1025','zz1030','zz1035','zz1040','zz1045','zz1050','zz1055','zz1065'    
		     //A1的调度班日生产综合记录 'zongheday'  'zz1015','zz1020','zz1025','zz1030','zz1035','zz1040','zz1045','zz1050','zz1055','zz1065'
		 //获取今日的日  格式为: YYYY-MM-DD
		  String date_dates = ConversionUtil.getYesterday();
		  String pre = "{call dbo.tasktijiao(?)}";
		   CallableStatement cstmt = null;
		    cstmt = con.prepareCall(pre);
			cstmt.setString(1, date_dates);
			cstmt.execute();
			result = "1";
	 }
	 catch(SQLException e){
		 e.printStackTrace();
	 } finally {
			try {
				if (con != null)
					con.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
	 return  result;
		
	}

	
}