定时任务很常用,在此写个例子做一下展示。
例子很简单,利用servlet的load-on-startup配置在init方法中启动一个定时器。
在需要的时间点启动任务即可。
web.xml配置
<!-- lsy测试 -->
<servlet>
<servlet-name>lsytestServlet</servlet-name>
<servlet-class>com.xxx.lsy.LsyTestServlet</servlet-class>
<init-param>
<param-name>dataSourceName</param-name>
<param-value>data1</param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>lsytestServlet</servlet-name>
<url-pattern>/lsytestServlet</url-pattern>
</servlet-mapping>
定时任务一般会和数据库打交道,这里我简单写了个数据库操作的任务,所以把数据库jdbc的部分封装了一下。
package com.sunyard.hawaii.lsy;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.naming.Context;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.sunyard.hawaii.lsy.sql.LsySqlUtil;
import com.sunyard.hawaii.lsy.sql.TimerTaskOne;
/**
* 内容1:
* 利用servlet配置中的load-on-startup在web应用启动后,servlet调用init方法。
* 在这个过程中可以初始化数据源,同时可以做一些其他操作,例如启动一个定时任务等。
* 注意load-on-startup范围是1-10,数字越大,优先级越小,启动越往后。
*
* 内容2:
* 把jdbc结果集封装到一个map中,包括字段名和值
* 数据库使用db2
*
* @author lushuaiyin
*
*/
public class LsyTestServlet extends HttpServlet {
public ServletContext servletContext=null;
public HttpServletRequest httpServletRequest=null;
public Context ctx = null;
public void init() throws ServletException {
System.out.println("LsyTestServlet init --------------------------------");
this.servletContext= this.getServletContext();
//获取web.xml配置中的初始化参数
String dataSourceName=this.getInitParameter("dataSourceName");
if(dataSourceName==null||dataSourceName.trim().equals("")){
System.out.println("初始化参数dataSourceName 未获取到!");
}else{
System.out.println("初始化参数dataSourceName :"+dataSourceName);
}
//定时任务
Timer timer = new Timer();
TimerTask tt1=new TimerTaskOne("task111");
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date startPoint_date=null;
String startPoint_Str="2013-08-16 08:37:15";
int taskPeriod=20000;//毫秒
try {
startPoint_date=sdf.parse(startPoint_Str);
System.out.println("开始执行任务时间点:"+startPoint_Str+",此后每隔"+taskPeriod+"毫秒执行一次任务。");
} catch (ParseException e) {
e.printStackTrace();
}
timer.scheduleAtFixedRate(tt1, startPoint_date, taskPeriod);
}
public void destroy(){
System.out.println("LsyTestServlet destroy --------------------------------");
}
/**
*
*/
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost( req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setHeader("cache-control", "no-cache");
req.setCharacterEncoding("GBK");
resp.setContentType("text/plain; charset=GBK");
work( req, resp);
}
protected void work(HttpServletRequest request, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter out = resp.getWriter();
HttpSession session = request.getSession();
System.out.pr