最近有需求要写一个定时任务 目的是更新一些员工/人员与部门之间的关系
项目用的是struts2 当我加了spring的jar包之后写了一个定时任务 项目经理不让用spring 就修改一下 这次贴个全的
下面是任务类
package com.timetask.action;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapExecutor;
import com.ibatis.sqlmap.engine.impl.SqlMapClientImpl;
import com.util.SqlMap;/*** Quartz定时任务* 更新* @author Administrator**/
public class TimeTaskAction {/*定时任务方法*/public void exec() throws SQLException{System.out.println("quartz定时任务开始");try {List<Map> companys = SqlMap.getSqlMap().queryForList("timetask.findAll_company");updateDept(companys);update_sys_yuang();} catch (Exception e) {e.printStackTrace();}System.out.println("quartz定时任务结束!");}/*递归更新部门表corpid*/public void updateDept(List<Map> list){try {for (Map map : list) {SqlMap.getSqlMap().update("timetask.updatetta_by_depid",map.get("DEPID").toString());SqlMap.getSqlMap().update("timetask.updatetta",map.get("DEPID").toString());List<Map> listLevel = SqlMap.getSqlMap().queryForList("timetask.findSubsidiary",map.get("DEPID").toString());if(listLevel.size()>0){updateDept(listLevel);}}} catch (SQLException e) {System.out.println("ibatis执行sql失败");e.printStackTrace();}}/*sys_yuang 表 corpid与sys_dept表corpid同步*/public void update_sys_yuang(){try {long starttime = System.currentTimeMillis();SqlMap.getSqlMap().update("timetask.update_sys_yuang_corpid");long endtime = System.currentTimeMillis()-starttime; System.out.println(endtime);} catch (SQLException e) {System.out.println("存储过程调用失败:"+e.getMessage());e.printStackTrace();}}}
上面是任务类,下面是struts2-quartz配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans><!-- 要调用的工作类 --><bean id="timetask" class="com.timetask.action.TimeTaskAction"></bean><!-- 定义调用对象和调用对象的方法 --><bean id="mainJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject"><ref bean="timetask"/></property><property name="targetMethod"><value>exec</value></property></bean><!-- 定义触发时间 --><!-- 创建触发器 触发器保存任务的执行时间--><bean id="timeTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"><property name="jobDetail" ref="mainJob"></property><!-- 每晚20:01分触发 --><property name="cronExpression" value="0 1 20 * * ?"></property></bean><bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref local="timeTrigger"/></list></property></bean>
</beans>
这是web.xml配置文件
下面是oracle的SQL的xml
把存储过程贴一下 其实就是俩游标
create or replace procedure update_userAndyuang_corpid
as
cursor cur is select d.depid,d.corpid,u.rowid row_id from sys_dept d,sys_user u where u.depid=d.depid order by u.rowid;
cursor cury is select d.depid,d.corpid,u.rowid row_id from sys_dept d,sys_yuang u where u.depid=d.depid order by u.rowid;
v_count number;begin
v_count :=0;
for r in cur loopupdate sys_user set corpid=r.corpid where rowid=r.row_id;v_count:=v_count+1;if(v_count>=1000) thencommit;v_count:=0;end if;
end loop;
commit;
for r in cury loopupdate sys_yuang set corpid=r.corpid where rowid=r.row_id;v_count:=v_count+1;if(v_count>=1000) thencommit;v_count:=0;end if;
end loop;
commit;
end update_userAndyuang_corpid;
成功执行了
完成