这个类最终功能是每天某个时间点(如每晚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;
}
}