web定時任務執行個體

來源:互聯網
上載者:User

定時任務很常用,在此寫個例子做一下展示。

例子很簡單,利用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.println(request.getParameter("startTime"));if(request.getParameter("enforceStartTask")!=null&&!request.getParameter("enforceStartTask").trim().equals("")){if(request.getParameter("enforceStartTask").trim().equals("1")){TimerTask task111=new TimerTaskOne("task111");Thread th1=new Thread(task111);th1.start();System.out.println("收到強制啟動定時任務命令,開啟一次定時任務。。。");}}out.println("success");}}

 

package com.sunyard.hawaii.lsy.sql;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Iterator;import java.util.Map;import java.util.TimerTask;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * 一個定時任務 * 這裡只是簡單的查表並更新欄位。 *  * @author lushuaiyin * */public class TimerTaskOne extends TimerTask{String name;public TimerTaskOne(String name){this.name=name;}@Overridepublic void run() {// TODO Auto-generated method stubSimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");long startTime=new Date().getTime();System.out.println("");System.out.println("執行一次任務:開始時間"+sdf.format(new Date()));String sql = "select id,cname,bak,flag  from LSY_TEST";Map resultData=LsySqlUtil.getInstancce().selectSql(sql);if(resultData!=null){Iterator it=resultData.keySet().iterator();for(;it.hasNext();){Object key=it.next();Object value=resultData.get(key);Pattern p=Pattern.compile("^[0-9]+$");Matcher m=p.matcher(key.toString());if(m.find()){Map row=(Map)value;String id=(String)row.get("ID");String bak=(String)row.get("BAK");if(id!=null&&!id.trim().equals("")){String updateSql="update LSY_TEST " +"set CDATE=date('"+sdf.format(new Date())+"') " +" where ID="+id.trim();LsySqlUtil.getInstancce().executeSql(updateSql);System.out.println(updateSql);}}//end if}// end for}//end iflong endTime=new Date().getTime();long spend=endTime-startTime;System.out.println("任務結束時間:"+sdf.format(new Date())+",花費時間:"+String.valueOf(spend)+"毫秒。");}}

 

package com.sunyard.hawaii.lsy.sql;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.util.HashMap;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.Map;/** * 封裝了jdbc底層操作,資料庫使用db2 * 查詢功能把jdbc結果集封裝到一個map中,包括欄位名和值 *  * 使用了單例模式 *  * @author lushuaiyin * */public class LsySqlUtil {public static final String DB2_URL = "jdbc:db2://127.0.0.1:50000/example";public static final String DB2_USERNAME = "db2admin";public static final String DB2_PASSWORD = "db2admin";public Connection con = null;public PreparedStatement stmt = null;public static LsySqlUtil lsySqlUtil=null;public static LsySqlUtil getInstancce(){if(lsySqlUtil==null){lsySqlUtil=new LsySqlUtil();}return lsySqlUtil;}public Connection getConnection() {try {if (con == null || con.isClosed()) {// 資料庫操作Class.forName("com.ibm.db2.jcc.DB2Driver");con = DriverManager.getConnection(DB2_URL, DB2_USERNAME,DB2_PASSWORD);}} catch (Exception e) {e.printStackTrace();}return con;}public void close() {try {if (stmt != null) {stmt.close();}if (con != null) {con.close();}} catch (Exception e) {e.printStackTrace();}}public Map selectSql(String sql) {Map resultData = new LinkedHashMap();// 結果集,序號key即第幾條;value是一個map,存放一條資料,key是資料庫欄位名,值是欄位值。if(sql==null||sql.trim().equals("")){}else{// 資料庫操作try {stmt = getInstancce().getConnection().prepareStatement(sql);ResultSet rs = stmt.executeQuery();System.out.println("rs.getType() :" + rs.getType()+ ",rs.getFetchSize():" + rs.getFetchSize());Map tableColumns = new HashMap();tableColumns = getResultColumns(rs);resultData.put("tableColumns", tableColumns);int rowNum = 0;while (rs.next()) {rowNum = rs.getRow();Map oneRowData = getRowMapFromResultRow(rs, tableColumns);resultData.put(rowNum, oneRowData);}System.out.println("擷取最後結果集Map大小:" + resultData.size());System.out.println("擷取最後結果集Map內容:" + resultData.toString());} catch (Exception e) {e.printStackTrace();} finally {try {getInstancce().close();} catch (Exception e) {e.printStackTrace();}}}return resultData;}//insert delete update public int executeSql(String sql) {int res = 0;if(sql==null||sql.trim().equals("")){}else{// 資料庫操作try {stmt = getInstancce().getConnection().prepareStatement(sql);res= stmt.executeUpdate();/* Returns:either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing */} catch (Exception e) {e.printStackTrace();} finally {try {getInstancce().close();} catch (Exception e) {e.printStackTrace();}}}return res;}// 擷取結果集的所有欄位名放入一個map中public static Map getResultColumns(ResultSet rs) {Map tableColumns = new HashMap();try {ResultSetMetaData rsMetaData = rs.getMetaData();for (int i = 1; i < rsMetaData.getColumnCount() + 1; i++) {System.out.println("結果集列資訊:" + rsMetaData.getColumnName(i)+ "------" + "getColumnLabel :"+ rsMetaData.getColumnLabel(i) + ",getColumnName :"+ rsMetaData.getColumnName(i) + ",rgetColumnType :"+ rsMetaData.getColumnType(i) + ",getColumnTypeName :"+ rsMetaData.getColumnTypeName(i) + ",getTableName :"+ rsMetaData.getTableName(i));tableColumns.put(i, rsMetaData.getColumnName(i));}} catch (Exception e) {e.printStackTrace();}return tableColumns;}// 把結果集中的一條資料放到一個map中public static Map getRowMapFromResultRow(ResultSet rs, Map tableColumns) {Map rowObj = new HashMap();if (tableColumns == null) {} else {try {Iterator it = tableColumns.keySet().iterator();while (it.hasNext()) {Object key = it.next();String value_columnName = (String) tableColumns.get(key);value_columnName = value_columnName == null ? "": value_columnName.trim();rowObj.put(value_columnName, rs.getString(value_columnName));}System.out.println("一條記錄:" + rowObj.toString());} catch (Exception e) {e.printStackTrace();}}return rowObj;}public static void main(String[] args) {// TODO Auto-generated method stubString sql = "select id,cname,bak,flag  from LSY_TEST";Map resultData=LsySqlUtil.getInstancce().selectSql(sql);}}

附上表結構:

CREATE TABLE AGENT.LSY_TEST (  IDINTEGERNOT NULL,  CNAMEVARCHAR(100),  CDATEDATE,  BAKVARCHAR(100),  FLAGINTEGER  )   IN USERSPACE1;ALTER TABLE AGENT.LSY_TEST  DATA CAPTURE NONE  PCTFREE 0  LOCKSIZE ROW  APPEND OFF  NOT VOLATILE;COMMENT ON AGENT.LSY_TEST ( ID IS '主鍵',CNAME IS '名稱',BAK IS '備忘',FLAG IS '標誌' );

啟動工程,定時任務控制台列印(其中也可以強製法命令啟動任務,具體看代碼):

2013-8-16 8:36:21 org.apache.coyote.http11.Http11Protocol init資訊: Initializing Coyote HTTP/1.1 on http-802013-8-16 8:36:21 org.apache.catalina.startup.Catalina load資訊: Initialization processed in 265 ms2013-8-16 8:36:21 org.apache.catalina.core.StandardService start資訊: Starting service Catalina2013-8-16 8:36:21 org.apache.catalina.core.StandardEngine start資訊: Starting Servlet Engine: Apache Tomcat/5.0.282013-8-16 8:36:21 org.apache.catalina.core.StandardHost start資訊: XML validation disabled2013-8-16 8:36:21 org.apache.catalina.core.StandardHost getDeployer資訊: Create Host deployer for direct deployment ( non-jmx ) 2013-8-16 8:36:21 org.apache.catalina.core.StandardHostDeployer install資訊: Processing Context configuration file URL file:D:\appEclipse\Tomcat5.0\conf\Catalina\localhost\admin.xml2013-8-16 8:36:21 org.apache.struts.util.PropertyMessageResources <init>資訊: Initializing, config='org.apache.struts.util.LocalStrings', returnNull=true2013-8-16 8:36:21 org.apache.struts.util.PropertyMessageResources <init>資訊: Initializing, config='org.apache.struts.action.ActionResources', returnNull=true2013-8-16 8:36:21 org.apache.struts.util.PropertyMessageResources <init>資訊: Initializing, config='org.apache.webapp.admin.ApplicationResources', returnNull=true2013-8-16 8:36:22 org.apache.catalina.core.StandardHostDeployer install資訊: Processing Context configuration file URL file:D:\appEclipse\Tomcat5.0\conf\Catalina\localhost\balancer.xml2013-8-16 8:36:22 org.apache.catalina.core.StandardHostDeployer install資訊: Processing Context configuration file URL file:D:\appEclipse\Tomcat5.0\conf\Catalina\localhost\manager.xml2013-8-16 8:36:22 org.apache.catalina.core.StandardHostDeployer install資訊: Processing Context configuration file URL file:D:\appEclipse\Tomcat5.0\conf\Catalina\localhost\webagent.xmlLsyTestServlet  init --------------------------------初始化參數dataSourceName :data1開始執行任務時間點:2013-08-16 08:37:15,此後每隔20000毫秒執行一次任務。2013-8-16 8:36:23 org.apache.catalina.core.StandardHostDeployer install資訊: Installing web application at context path /downfle from URL file:D:\appEclipse\Tomcat5.0\webapps\downfle2013-8-16 8:36:23 org.apache.catalina.core.StandardHostDeployer install資訊: Installing web application at context path /jsp-examples from URL file:D:\appEclipse\Tomcat5.0\webapps\jsp-examples2013-8-16 8:36:23 org.apache.catalina.core.StandardHostDeployer install資訊: Installing web application at context path  from URL file:D:\appEclipse\Tomcat5.0\webapps\ROOT2013-8-16 8:36:23 org.apache.catalina.core.StandardHostDeployer install資訊: Installing web application at context path /servlets-examples from URL file:D:\appEclipse\Tomcat5.0\webapps\servlets-examples2013-8-16 8:36:23 org.apache.catalina.core.StandardHostDeployer install資訊: Installing web application at context path /tomcat-docs from URL file:D:\appEclipse\Tomcat5.0\webapps\tomcat-docs2013-8-16 8:36:23 org.apache.catalina.core.StandardHostDeployer install資訊: Installing web application at context path /webdav from URL file:D:\appEclipse\Tomcat5.0\webapps\webdav2013-8-16 8:36:23 org.apache.coyote.http11.Http11Protocol start資訊: Starting Coyote HTTP/1.1 on http-802013-8-16 8:36:23 org.apache.jk.common.ChannelSocket init資訊: JK2: ajp13 listening on /0.0.0.0:80092013-8-16 8:36:23 org.apache.jk.server.JkMain start資訊: Jk running ID=0 time=0/63  config=D:\appEclipse\Tomcat5.0\conf\jk2.properties2013-8-16 8:36:23 org.apache.catalina.startup.Catalina start資訊: Server startup in 1968 ms執行一次任務:開始時間2013-08-16 08:37:15rs.getType() :1003,rs.getFetchSize():0結果集列資訊:ID------getColumnLabel :ID,getColumnName :ID,rgetColumnType :4,getColumnTypeName :INTEGER,getTableName :LSY_TEST結果集列資訊:CNAME------getColumnLabel :CNAME,getColumnName :CNAME,rgetColumnType :12,getColumnTypeName :VARCHAR,getTableName :LSY_TEST結果集列資訊:BAK------getColumnLabel :BAK,getColumnName :BAK,rgetColumnType :12,getColumnTypeName :VARCHAR,getTableName :LSY_TEST結果集列資訊:FLAG------getColumnLabel :FLAG,getColumnName :FLAG,rgetColumnType :4,getColumnTypeName :INTEGER,getTableName :LSY_TEST一條記錄:{CNAME=lushuaiyin, BAK=b1, ID=11, FLAG=1}一條記錄:{CNAME=cc2, BAK=b2, ID=12, FLAG=0}一條記錄:{CNAME=cc3, BAK=b33, ID=13, FLAG=0}一條記錄:{CNAME=cc4, BAK=b4, ID=14, FLAG=1}一條記錄:{CNAME=cc5, BAK=b5, ID=15, FLAG=1}擷取最後結果集Map大小:6擷取最後結果集Map內容:{tableColumns={1=ID, 2=CNAME, 3=BAK, 4=FLAG}, 1={CNAME=lushuaiyin, BAK=b1, ID=11, FLAG=1}, 2={CNAME=cc2, BAK=b2, ID=12, FLAG=0}, 3={CNAME=cc3, BAK=b33, ID=13, FLAG=0}, 4={CNAME=cc4, BAK=b4, ID=14, FLAG=1}, 5={CNAME=cc5, BAK=b5, ID=15, FLAG=1}}update LSY_TEST set CDATE=date('2013-08-16 08:37:15')  where ID=11update LSY_TEST set CDATE=date('2013-08-16 08:37:15')  where ID=12update LSY_TEST set CDATE=date('2013-08-16 08:37:15')  where ID=13update LSY_TEST set CDATE=date('2013-08-16 08:37:15')  where ID=14update LSY_TEST set CDATE=date('2013-08-16 08:37:15')  where ID=15任務結束時間:2013-08-16 08:37:15,花費時間:375毫秒。執行一次任務:開始時間2013-08-16 08:37:35rs.getType() :1003,rs.getFetchSize():0結果集列資訊:ID------getColumnLabel :ID,getColumnName :ID,rgetColumnType :4,getColumnTypeName :INTEGER,getTableName :LSY_TEST結果集列資訊:CNAME------getColumnLabel :CNAME,getColumnName :CNAME,rgetColumnType :12,getColumnTypeName :VARCHAR,getTableName :LSY_TEST結果集列資訊:BAK------getColumnLabel :BAK,getColumnName :BAK,rgetColumnType :12,getColumnTypeName :VARCHAR,getTableName :LSY_TEST結果集列資訊:FLAG------getColumnLabel :FLAG,getColumnName :FLAG,rgetColumnType :4,getColumnTypeName :INTEGER,getTableName :LSY_TEST一條記錄:{CNAME=lushuaiyin, BAK=b1, ID=11, FLAG=1}一條記錄:{CNAME=cc2, BAK=b2, ID=12, FLAG=0}一條記錄:{CNAME=cc3, BAK=b33, ID=13, FLAG=0}一條記錄:{CNAME=cc4, BAK=b4, ID=14, FLAG=1}一條記錄:{CNAME=cc5, BAK=b5, ID=15, FLAG=1}擷取最後結果集Map大小:6擷取最後結果集Map內容:{tableColumns={1=ID, 2=CNAME, 3=BAK, 4=FLAG}, 1={CNAME=lushuaiyin, BAK=b1, ID=11, FLAG=1}, 2={CNAME=cc2, BAK=b2, ID=12, FLAG=0}, 3={CNAME=cc3, BAK=b33, ID=13, FLAG=0}, 4={CNAME=cc4, BAK=b4, ID=14, FLAG=1}, 5={CNAME=cc5, BAK=b5, ID=15, FLAG=1}}update LSY_TEST set CDATE=date('2013-08-16 08:37:35')  where ID=11update LSY_TEST set CDATE=date('2013-08-16 08:37:35')  where ID=12update LSY_TEST set CDATE=date('2013-08-16 08:37:35')  where ID=13update LSY_TEST set CDATE=date('2013-08-16 08:37:35')  where ID=14update LSY_TEST set CDATE=date('2013-08-16 08:37:35')  where ID=15任務結束時間:2013-08-16 08:37:35,花費時間:95毫秒。null收到強制啟動定時任務命令,開啟一次定時任務。。。執行一次任務:開始時間2013-08-16 08:37:46rs.getType() :1003,rs.getFetchSize():0結果集列資訊:ID------getColumnLabel :ID,getColumnName :ID,rgetColumnType :4,getColumnTypeName :INTEGER,getTableName :LSY_TEST結果集列資訊:CNAME------getColumnLabel :CNAME,getColumnName :CNAME,rgetColumnType :12,getColumnTypeName :VARCHAR,getTableName :LSY_TEST結果集列資訊:BAK------getColumnLabel :BAK,getColumnName :BAK,rgetColumnType :12,getColumnTypeName :VARCHAR,getTableName :LSY_TEST結果集列資訊:FLAG------getColumnLabel :FLAG,getColumnName :FLAG,rgetColumnType :4,getColumnTypeName :INTEGER,getTableName :LSY_TEST一條記錄:{CNAME=lushuaiyin, BAK=b1, ID=11, FLAG=1}一條記錄:{CNAME=cc2, BAK=b2, ID=12, FLAG=0}一條記錄:{CNAME=cc3, BAK=b33, ID=13, FLAG=0}一條記錄:{CNAME=cc4, BAK=b4, ID=14, FLAG=1}一條記錄:{CNAME=cc5, BAK=b5, ID=15, FLAG=1}擷取最後結果集Map大小:6擷取最後結果集Map內容:{tableColumns={1=ID, 2=CNAME, 3=BAK, 4=FLAG}, 1={CNAME=lushuaiyin, BAK=b1, ID=11, FLAG=1}, 2={CNAME=cc2, BAK=b2, ID=12, FLAG=0}, 3={CNAME=cc3, BAK=b33, ID=13, FLAG=0}, 4={CNAME=cc4, BAK=b4, ID=14, FLAG=1}, 5={CNAME=cc5, BAK=b5, ID=15, FLAG=1}}update LSY_TEST set CDATE=date('2013-08-16 08:37:46')  where ID=11update LSY_TEST set CDATE=date('2013-08-16 08:37:46')  where ID=12update LSY_TEST set CDATE=date('2013-08-16 08:37:46')  where ID=13update LSY_TEST set CDATE=date('2013-08-16 08:37:46')  where ID=14update LSY_TEST set CDATE=date('2013-08-16 08:37:46')  where ID=15任務結束時間:2013-08-16 08:37:46,花費時間:111毫秒。

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.