玩转 quartz quartz 教程 quartz 实现 quartz 封装
转载请表明出处,作者 keyboardsun
需要源代码,发邮件到[email protected]
代码可以直接使用。
最近在开发JDF项目。项目中需要用到任务调度,自动任务等功能,想自己开发一个,但是看看 quartz 那么强劲,自己开发,开发加调试,可能需要些时日。如果用quartz可能一天就可以搞定,只需要配置点数据就可以了。
下面步入正题。讲解quartz的封装使用。
这里我把任务,以及任务的表达式配置到数据库里面。
如图:
如上图所示,配置了三个任务。
表结构介绍:
- -- ----------------------------
- -- Table structure for job_task
- -- ----------------------------
- CREATE TABLE `job_task` (
- `TASK_ID` int(11) NOT NULL,
- `TASK_CODE` varchar(255) default NULL,
- `TASK_TYPE` varchar(255) default NULL,
- `TASK_IMPL_CLASS` varchar(255) default NULL,
- `TASK_EXPRESS` varchar(50) default NULL,
- `STATE_DATE` datetime default NULL,
- `STATE` varchar(2) default NULL COMMENT 'U 使用中 O已结束',
- `PARMS` varchar(500) default NULL,
- `REMARK` varchar(2000) default NULL,
- `CREATE_DATE` datetime default NULL,
- PRIMARY KEY (`TASK_ID`)
- ) ENGINE=InnoDB DEFAULT CHARSET=gbk;
-- ---------------------------- -- Table structure for job_task -- ---------------------------- CREATE TABLE `job_task` ( `TASK_ID` int(11) NOT NULL, `TASK_CODE` varchar(255) default NULL, `TASK_TYPE` varchar(255) default NULL, `TASK_IMPL_CLASS` varchar(255) default NULL, `TASK_EXPRESS` varchar(50) default NULL, `STATE_DATE` datetime default NULL, `STATE` varchar(2) default NULL COMMENT 'U 使用中 O已结束', `PARMS` varchar(500) default NULL, `REMARK` varchar(2000) default NULL, `CREATE_DATE` datetime default NULL, PRIMARY KEY (`TASK_ID`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk;
字段介绍:
TASK_ID 任务的主键
TASK_CODE 任务编码 ,这里启动任务的时候,作为qz任务的名称
TASK_TYPE_CODE 任务类型,这里启动任务的时候,作为qz任务的分组
TASK_IMPL_CLASS 任务的类。
TASK_EXPRESS 任务执行表达式
STATE_DATE 任务更新时间,这里在任务运行中,如果需要使运行中的任务修改立马生效,需要把这个字段的值设置大于当前时间。
STATE 任务状态
PARMS 任务初始化参数,任务运行的时候,可以从JobDataMap对象中获取该字段的值。
CREATE_DATE 创建日期,没有什么实际意义。
下面需要记录任务执行的日志,如下图所示
如上图所示,log编号是12 的任务正在执行中... STATE是R =run
字段解释
- -- ----------------------------
- -- Table structure for task_log
- -- ----------------------------
- CREATE TABLE `task_log` (
- `TASK_LOG_ID` int(8) NOT NULL,
- `TASK_ID` int(8) default NULL,
- `STATE` varchar(2) default NULL COMMENT 'O结束,R运行中,E异常结束',
- `START_DATE` datetime default NULL,
- `FINISH_DATE` datetime default NULL,
- `REMARKS` varchar(2000) default NULL,
- PRIMARY KEY (`TASK_LOG_ID`)
- ) ENGINE=InnoDB DEFAULT CHARSET=gbk;
-- ---------------------------- -- Table structure for task_log -- ---------------------------- CREATE TABLE `task_log` ( `TASK_LOG_ID` int(8) NOT NULL, `TASK_ID` int(8) default NULL, `STATE` varchar(2) default NULL COMMENT 'O结束,R运行中,E异常结束', `START_DATE` datetime default NULL, `FINISH_DATE` datetime default NULL, `REMARKS` varchar(2000) default NULL, PRIMARY KEY (`TASK_LOG_ID`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk;
TASK_LOG_ID 任务日志编号
TASK_ID 任务编号
STATE 执行状态,如果是E 的,说明异常了,异常信息会放在REMARKS字段中
START_DATE 执行开始时间
FINISH_DATE 执行结束时间
REMARKS 备注。
下面要开始贴代码啦:如下图所示,一共包括如下这么多的JAVA文件。
一共包括文件为:
ITask.java 业务系统需要实现的接口方法。
JDBC.java 简单的数据库操作类
JobEngine 用于修改运行中的job的信息,定时扫描JOB_TASK配置表的改变信息。
JobTaskBean.java 表JOB_TASK对应的bean
Mouse.java 入口类,启动qz引擎。
Task.java 抽象类,用于记录qz 任务的日志,业务系统的任务需要继承这个类。
TaskLogBean.java 任务日志表TASK_LOG对应的Bean.
Test.java 测试任务。
下面开始贴代码啦:
ITask.java
- package net.chinacsharp.jdf.quartz;
- import java.util.HashMap;
- /**
- * 业务系统需要实现的接口方法。
- *
- * @author keyboardsun
- */
- public interface ITask{
- /**
- * 这里留了一个execute接口给业务系统使用,业务系统写任务的时候,只需要继承Task类就可以了。
- *
- * @param map 这里的map功能可强劲了噢,因为很多任务执行可能需要传入参数,这个参数可以配置在JOB_TASK表的PARMS字段里面
- * 比如配置
- * <item>
- * <key>sss</key>
- * <value>vvv</value>
- * </item>
- * <item>
- * <key>ss</key>
- * <value>vv</value>
- * </item>
- * 这里在程序运行中,启动业务系统job的时候,会吧上面的记录已MAP的形式传递过去。
- * 这个在PARMS字段里面,那么在业务系统实现这个方法的时候,可以通过
- * map.get("ss") 获得 vv 值
- */
- public void execute( HashMap map );
- }
package net.chinacsharp.jdf.quartz; import java.util.HashMap; /** * 业务系统需要实现的接口方法。 * * @author keyboardsun */ public interface ITask{ /** * 这里留了一个execute接口给业务系统使用,业务系统写任务的时候,只需要继承Task类就可以了。 * * @param map 这里的map功能可强劲了噢,因为很多任务执行可能需要传入参数,这个参数可以配置在JOB_TASK表的PARMS字段里面 * 比如配置 * <item> * <key>sss</key> * <value>vvv</value> * </item> * <item> * <key>ss</key> * <value>vv</value> * </item> * 这里在程序运行中,启动业务系统job的时候,会吧上面的记录已MAP的形式传递过去。 * 这个在PARMS字段里面,那么在业务系统实现这个方法的时候,可以通过 * map.get("ss") 获得 vv 值 */ public void execute( HashMap map ); }
JDBC.java
- package net.chinacsharp.jdf.quartz;
- import java.io.StringReader;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Time;
- import java.sql.Timestamp;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- /**
- * 简单的数据库操作类
- * @author keyboardsun
- *
- */
- public class JDBC{
- /**
- * 获取数据库连接,这里的例子是用mysql的
- * @return
- * @throws Exception
- */
- public static Connection getConnection()throws Exception {
- try {
- Class.forName("com.mysql.jdbc.Driver").newInstance();
- Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/qz", "root", "admin");
- conn.setAutoCommit(true);
- return conn;
- } catch (Exception e) {
- throw e;
- }
- }
- /**
- * 插入操作日志,返回操作日志的主键的值。
- * 这里用了同步,可能执行过程中会影响效率,当然这里可以选择用static变量都是可以了,反正这是一个解决办法而已,随便你怎么搞,
- * 这个只是一个超级简单的例子,能看明白怎么回事就好了。
- * @param sql
- * @param map
- * @return
- * @throws Exception
- */
- public synchronized static TaskLogBean insert(String sql,HashMap map) throws Exception{
- Connection con = getConnection();
- String sql_ = "SELECT MAX(TASK_LOG_ID)+1 FROM TASK_LOG"; //获取最大的值+1 作为主键,这里方法比较土。
- PreparedStatement ps = con.prepareStatement(sql_);
- ResultSet rs = ps.executeQuery();
- rs.next();
- map.put("TASK_LOG_ID",new Long(rs.getLong(1)));
- rs.close();
- ps = execStatementValues(con,sql,map);
- ps.executeUpdate();
- sql_= "SELECT * FROM TASK_LOG WHERE TASK_LOG_ID=:TASK_LOG_ID";
- TaskLogBean[] bean = getTaskLogBean(con,sql_, map);
- return bean[0];
- }
- /**
- * 获取JOB的任务列表。
- * @param sql
- * @param map
- * @return
- * @throws Exception
- */
- public static JobTaskBean[] getJobTaskBean(String sql,HashMap map) throws Exception{
- Connection con = getConnection();
- PreparedStatement ps = execStatementValues(con,sql,map);
- ResultSet rs = ps.executeQuery();
- List list = new ArrayList();
- while(rs.next()){
- JobTaskBean bean = new JobTaskBean();
- bean.setCreateDate(rs.getTimestamp("CREATE_DATE"));
- bean.setParms(rs.getString("PARMS"));
- bean.setRemark(rs.getString("REMARK"));
- bean.setState(rs.getString("STATE"));
- bean.setStateDate(rs.getTimestamp("STATE_DATE"));
- bean.setTaskCode(rs.getString("TASK_CODE"));
- bean.setTaskExpress(rs.getString("TASK_EXPRESS"));
- bean.setTaskId(rs.getLong("TASK_ID"));
- bean.setTaskImplClass(rs.getString("TASK_IMPL_CLASS"));
- bean.setTaskType(rs.getString("TASK_TYPE"));
- list.add(bean);
- }
- rs.close();
- con.close();
- return list.size()==0?null:(JobTaskBean[])list.toArray(new JobTaskBean[0]);
- }
- /**
- * 获取任务日志记录
- * @param con
- * @param sql
- * @param map
- * @return
- * @throws Exception
- */
- public static TaskLogBean[] getTaskLogBean(Connection con,String sql,HashMap map) throws Exception{
- if(con==null)
- con = getConnection(); //这里连接可以传空,无所谓的。
- PreparedStatement ps = execStatementValues(con,sql,map);
- ResultSet rs = ps.executeQuery();
- List list = new ArrayList();
- while(rs.next()){
- TaskLogBean bean = new TaskLogBean();
- bean.setFinishDate(rs.getTimestamp("FINISH_DATE"));
- bean.setRemarks(rs.getString("REMARKS"));
- bean.setStartDate(rs.getTimestamp("START_DATE"));
- bean.setState(rs.getString("STATE"));
- bean.setTaskId(rs.getLong("TASK_ID"));
- bean.setTaskLogId(rs.getLong("TASK_LOG_ID"));
- list.add(bean);
- }
- rs.close();
- con.close();
- return list.size()==0?null:(TaskLogBean[])list.toArray(new TaskLogBean[0]);
- }
- /**
- * 以下方法用于绑定变量的,没啥技术含量。
- * 可以参看我的另外的数据库绑定变量的blog。
- * 更多代码可以去sourceforge下载jdf项目看看。
- * @param con 数据库连接
- * @param sql 绑定变量类型的sql
- * @param map 绑定值和绑定名字
- * @return 赋值初始化好的
- * @throws SQLException
- */
- public static PreparedStatement execStatementValues(Connection con,String sql,HashMap map) throws Exception{
- PreparedStatement stmt = null;
- ArrayList clumBandNameList = new ArrayList(); //存放绑定变量的名字
- sql = sql + " ";
- String [] temp = sql.split(":"); //这里把变量的名字给取出来
- for (int i = 1; i < temp.length; i++) {
- try{
- clumBandNameList.add(temp[i].substring(0,temp[i].indexOf(" ")));
- } catch(StringIndexOutOfBoundsException exception){
- clumBandNameList.add(temp[i]);
- }
- }
- sql = sql.replaceAll(":(.*?)\\s","?");//把绑定变量的名字:XXX 取出为 ?,生成标准SQL
- stmt = con.prepareStatement(sql);
- int index = 0;
- for (int i = 0; i < clumBandNameList.size(); i++) {
- if(map==null||map.size()<1){
- throw new SQLException("有的变量的值没有赋,请确定每个绑定的都有值了:"+sql+"\n"+map.toString());
- }
- Object value = null;
- try{
- value = map.get(clumBandNameList.get(i));
- // log.debug("邦定变量的值:"+clumBandNameList.get(i)+"="+value.toString());
- }catch(Exception e){
- throw new Exception("变量:"+clumBandNameList.get(i)+" 没有对应绑定的值");
- }
- String type = value.getClass().getName().substring(value.getClass().getName().lastIndexOf(".")); //获取绑定的类型
- index = i+1; //绑定的索引
- if (type.equalsIgnoreCase("String")) {
- String content = value.toString();
- if (content.length() > 2000) {
- stmt.setCharacterStream(index, new StringReader(content), content.length());
- } else {
- stmt.setString(index, content);
- }
- } else if (type.equalsIgnoreCase("Short")) {
- stmt.setShort(index, Short.parseShort(value.toString()));
- } else if (type.equalsIgnoreCase("Integer")) {
- stmt.setInt(index, Integer.parseInt(value.toString()));
- } else if (type.equalsIgnoreCase("Float")) {
- stmt.setFloat(index, Float.parseFloat(value.toString()));
- } else if (type.equalsIgnoreCase("Byte")) {
- stmt.setByte(index, Byte.parseByte(value.toString()));
- } else if (type.equalsIgnoreCase("Char")) {
- stmt.setString(index, value.toString());
- } else if (type.equalsIgnoreCase("Long")) {
- stmt.setLong(index, Long.parseLong(value.toString()));
- } else if (type.equalsIgnoreCase("Double")) {
- stmt.setDouble(index, Double.parseDouble(value.toString()));
- }else if (type.equalsIgnoreCase("Boolean")) {
- stmt.setBoolean(index, Boolean.getBoolean(value.toString()));
- } else if (type.equalsIgnoreCase("Date")) {
- if (value instanceof java.sql.Date)
- stmt.setDate(index, (java.sql.Date)value);
- else
- stmt.setDate(index, java.sql.Date.valueOf(value.toString()));
- } else if (type.equalsIgnoreCase("Time")) {
- if (value instanceof Time)
- stmt.setTime(index, (Time)value);
- else
- stmt.setTime(index, Time.valueOf(value.toString()));
- } else if (type.equalsIgnoreCase("DateTime")) {
- if (value instanceof Timestamp)
- stmt.setTimestamp(index, (Timestamp)value);
- else if (value instanceof java.sql.Date)
- stmt.setTimestamp(index, new Timestamp(((java.sql.Date)value).getTime()));
- else
- stmt.setTimestamp(index, Timestamp.valueOf(value.toString()));
- }
- else if(type.equalsIgnoreCase("Timestamp")){
- stmt.setTimestamp(index, (Timestamp)value);
- }
- else if (value instanceof Character) {
- stmt.setString(index, value.toString());
- } else {
- stmt.setObject(index, value);
- }
- }
- return stmt;
- }
- }
package net.chinacsharp.jdf.quartz; import java.io.StringReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; import java.util.ArrayList; import java.util.HashMap; import java.util.List; /** * 简单的数据库操作类 * @author keyboardsun * */ public class JDBC{ /** * 获取数据库连接,这里的例子是用mysql的 * @return * @throws Exception */ public static Connection getConnection()throws Exception { try { Class.forName("com.mysql.jdbc.Driver").newInstance(); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/qz", "root", "admin"); conn.setAutoCommit(true); return conn; } catch (Exception e) { throw e; } } /** * 插入操作日志,返回操作日志的主键的值。 * 这里用了同步,可能执行过程中会影响效率,当然这里可以选择用static变量都是可以了,反正这是一个解决办法而已,随便你怎么搞, * 这个只是一个超级简单的例子,能看明白怎么回事就好了。 * @param sql * @param map * @return * @throws Exception */ public synchronized static TaskLogBean insert(String sql,HashMap map) throws Exception{ Connection con = getConnection(); String sql_ = "SELECT MAX(TASK_LOG_ID)+1 FROM TASK_LOG"; //获取最大的值+1 作为主键,这里方法比较土。 PreparedStatement ps = con.prepareStatement(sql_); ResultSet rs = ps.executeQuery(); rs.next(); map.put("TASK_LOG_ID",new Long(rs.getLong(1))); rs.close(); ps = execStatementValues(con,sql,map); ps.executeUpdate(); sql_= "SELECT * FROM TASK_LOG WHERE TASK_LOG_ID=:TASK_LOG_ID"; TaskLogBean[] bean = getTaskLogBean(con,sql_, map); return bean[0]; } /** * 获取JOB的任务列表。 * @param sql * @param map * @return * @throws Exception */ public static JobTaskBean[] getJobTaskBean(String sql,HashMap map) throws Exception{ Connection con = getConnection(); PreparedStatement ps = execStatementValues(con,sql,map); ResultSet rs = ps.executeQuery(); List list = new ArrayList(); while(rs.next()){ JobTaskBean bean = new JobTaskBean(); bean.setCreateDate(rs.getTimestamp("CREATE_DATE")); bean.setParms(rs.getString("PARMS")); bean.setRemark(rs.getString("REMARK")); bean.setState(rs.getString("STATE")); bean.setStateDate(rs.getTimestamp("STATE_DATE")); bean.setTaskCode(rs.getString("TASK_CODE")); bean.setTaskExpress(rs.getString("TASK_EXPRESS")); bean.setTaskId(rs.getLong("TASK_ID")); bean.setTaskImplClass(rs.getString("TASK_IMPL_CLASS")); bean.setTaskType(rs.getString("TASK_TYPE")); list.add(bean); } rs.close(); con.close(); return list.size()==0?null:(JobTaskBean[])list.toArray(new JobTaskBean[0]); } /** * 获取任务日志记录 * @param con * @param sql * @param map * @return * @throws Exception */ public static TaskLogBean[] getTaskLogBean(Connection con,String sql,HashMap map) throws Exception{ if(con==null) con = getConnection(); //这里连接可以传空,无所谓的。 PreparedStatement ps = execStatementValues(con,sql,map); ResultSet rs = ps.executeQuery(); List list = new ArrayList(); while(rs.next()){ TaskLogBean bean = new TaskLogBean(); bean.setFinishDate(rs.getTimestamp("FINISH_DATE")); bean.setRemarks(rs.getString("REMARKS")); bean.setStartDate(rs.getTimestamp("START_DATE")); bean.setState(rs.getString("STATE")); bean.setTaskId(rs.getLong("TASK_ID")); bean.setTaskLogId(rs.getLong("TASK_LOG_ID")); list.add(bean); } rs.close(); con.close(); return list.size()==0?null:(TaskLogBean[])list.toArray(new TaskLogBean[0]); } /** * 以下方法用于绑定变量的,没啥技术含量。 * 可以参看我的另外的数据库绑定变量的blog。 * 更多代码可以去sourceforge下载jdf项目看看。 * @param con 数据库连接 * @param sql 绑定变量类型的sql * @param map 绑定值和绑定名字 * @return 赋值初始化好的 * @throws SQLException */ public static PreparedStatement execStatementValues(Connection con,String sql,HashMap map) throws Exception{ PreparedStatement stmt = null; ArrayList clumBandNameList = new ArrayList(); //存放绑定变量的名字 sql = sql + " "; String [] temp = sql.split(":"); //这里把变量的名字给取出来 for (int i = 1; i < temp.length; i++) { try{ clumBandNameList.add(temp[i].substring(0,temp[i].indexOf(" "))); } catch(StringIndexOutOfBoundsException exception){ clumBandNameList.add(temp[i]); } } sql = sql.replaceAll(":(.*?)\\s","?");//把绑定变量的名字:XXX 取出为 ?,生成标准SQL stmt = con.prepareStatement(sql); int index = 0; for (int i = 0; i < clumBandNameList.size(); i++) { if(map==null||map.size()<1){ throw new SQLException("有的变量的值没有赋,请确定每个绑定的都有值了:"+sql+"\n"+map.toString()); } Object value = null; try{ value = map.get(clumBandNameList.get(i)); // log.debug("邦定变量的值:"+clumBandNameList.get(i)+"="+value.toString()); }catch(Exception e){ throw new Exception("变量:"+clumBandNameList.get(i)+" 没有对应绑定的值"); } String type = value.getClass().getName().substring(value.getClass().getName().lastIndexOf(".")); //获取绑定的类型 index = i+1; //绑定的索引 if (type.equalsIgnoreCase("String")) { String content = value.toString(); if (content.length() > 2000) { stmt.setCharacterStream(index, new StringReader(content), content.length()); } else { stmt.setString(index, content); } } else if (type.equalsIgnoreCase("Short")) { stmt.setShort(index, Short.parseShort(value.toString())); } else if (type.equalsIgnoreCase("Integer")) { stmt.setInt(index, Integer.parseInt(value.toString())); } else if (type.equalsIgnoreCase("Float")) { stmt.setFloat(index, Float.parseFloat(value.toString())); } else if (type.equalsIgnoreCase("Byte")) { stmt.setByte(index, Byte.parseByte(value.toString())); } else if (type.equalsIgnoreCase("Char")) { stmt.setString(index, value.toString()); } else if (type.equalsIgnoreCase("Long")) { stmt.setLong(index, Long.parseLong(value.toString())); } else if (type.equalsIgnoreCase("Double")) { stmt.setDouble(index, Double.parseDouble(value.toString())); }else if (type.equalsIgnoreCase("Boolean")) { stmt.setBoolean(index, Boolean.getBoolean(value.toString())); } else if (type.equalsIgnoreCase("Date")) { if (value instanceof java.sql.Date) stmt.setDate(index, (java.sql.Date)value); else stmt.setDate(index, java.sql.Date.valueOf(value.toString())); } else if (type.equalsIgnoreCase("Time")) { if (value instanceof Time) stmt.setTime(index, (Time)value); else stmt.setTime(index, Time.valueOf(value.toString())); } else if (type.equalsIgnoreCase("DateTime")) { if (value instanceof Timestamp) stmt.setTimestamp(index, (Timestamp)value); else if (value instanceof java.sql.Date) stmt.setTimestamp(index, new Timestamp(((java.sql.Date)value).getTime())); else stmt.setTimestamp(index, Timestamp.valueOf(value.toString())); } else if(type.equalsIgnoreCase("Timestamp")){ stmt.setTimestamp(index, (Timestamp)value); } else if (value instanceof Character) { stmt.setString(index, value.toString()); } else { stmt.setObject(index, value); } } return stmt; } }
JobEngine.java
- package net.chinacsharp.jdf.quartz;
- import java.io.ByteArrayInputStream;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.List;
- import org.dom4j.Document;
- import org.dom4j.Element;
- import org.dom4j.io.SAXReader;
- import org.quartz.CronTrigger;
- import org.quartz.Job;
- import org.quartz.JobDataMap;
- import org.quartz.JobDetail;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- import org.quartz.Scheduler;
- /**
- * 这只是一个简单的JOB而已,名字貌似很NB,这个任务用于实时的检测任务列表的状态,用于更新JOB。
- * 这样你改了个配置,可以立马生效的噢。
- * 这个类用于在JOB运行期间,使得修改立马生效。
- * @author keyboardsun
- *
- */
- public class JobEngine
- implements Job{
- public void execute( JobExecutionContext arg0 ) throws JobExecutionException{
- try{
- Scheduler inScheduler = arg0.getScheduler();
- JobDetail job = null;
- JobDataMap map = null;
- CronTrigger trigger = null;
- /**
- * 这里根据状态U使用的,以及STATE_DATE日期大于当前日期,判断这个任务是刚更新的,如果你想使得修改的JOB立马生效。你需要吧JOB_TASK的字段的值改得大于当前日期,那样这里就会更新到了噢。
- */
- JobTaskBean[] bean = JDBC.getJobTaskBean( "SELECT * FROM JOB_TASK WHERE STATE='U' AND STATE_DATE>now()", new HashMap() );
- if( bean == null )
- return;
- for( int i = 0; i < bean.length; i++ ){
- //这里使得修改的job更新,为了避免重复更新,需要吧STATE_DATE日期改过来。
- String update = "UPDATE JOB_TASK SET STATE_DATE=now() WHERE TASK_ID=:TASK_ID";
- Connection con = JDBC.getConnection();
- HashMap m = new HashMap();
- m.put( "TASK_ID", new Long( bean[i].getTaskId() ) );
- PreparedStatement ps = JDBC.execStatementValues( con, update, m );
- ps.executeUpdate();
- con.close();
- map = new JobDataMap();