定时任务:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"
default-lazy-init="true">
<description>Quartz的定时任务配置</description>
<!-- Quartz集成工厂 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
<!-- Triggers集成 设置调度-->
<property name="triggers">
<list>
<ref bean="autoTicketTaskDoTrigger" />
<ref bean="beaGiveAutoUnfrozenDoTrigger" />
<ref bean="lvyueWarnDoTrigger" />
</list>
</property>
<!-- Quartz配置 -->
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.threadCount">3</prop>
</props>
</property>
</bean>
<!-- 定时器一:碳票拆分任务处理 start -->
<!-- 1.定义业务逻辑处理类 -->
<bean id="autoTicketTaskDo" class="com.zbxsoft.zbxapp.common.base.TicketTaskDo"/>
<!-- 2.增加调度业务逻辑 -->
<bean id="autoautoTicketTaskDoJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="autoTicketTaskDo" />
<property name="targetMethod" value="unDoTaskList" />
</bean>
<!-- 3.注解定时任务 -->
<bean id="autoTicketTaskDoTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="autoautoTicketTaskDoJob" />
<property name="cronExpression" value="0 0 20 * * ? " /> <!-- 每天20点00分执行处理 -->
</bean>
<!-- 碳票拆分任务处理 end -->
<!-- 定时器二:配额发放自动解冻 start -->
<!-- 1.定义业务逻辑处理类 -->
<bean id="beaGiveAutoUnfrozenDo" class="com.zbxsoft.zbxapp.common.base.BeaGiveAutoUnfrozenDo"/>
<!-- 2.增加调度业务逻辑 -->
<bean id="beaGiveAutoUnfrozenDoJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="beaGiveAutoUnfrozenDo" />
<property name="targetMethod" value="autoUnfrozenDo" />
</bean>
<!-- 3.注解定时任务 -->
<bean id="beaGiveAutoUnfrozenDoTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="beaGiveAutoUnfrozenDoJob" />
<property name="cronExpression" value="0 0 21 * * ? " /> <!-- 每天21点00分执行处理 -->
</bean>
<!-- 配额发放自动解冻任务处理 end -->
<!-- 定时器三:配额履约提醒任务处理 start -->
<!-- 1.定义业务逻辑处理类 -->
<bean id="lvyueWarnDo" class="com.zbxsoft.zbxapp.common.base.LvyueWarnDo"/>
<!-- 2.增加调度业务逻辑 -->
<bean id="lvyueWarnDoJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="lvyueWarnDo" />
<property name="targetMethod" value="luyueWarn" />
</bean>
<!-- 3.注解定时任务 -->
<bean id="lvyueWarnDoTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="lvyueWarnDoJob" />
<property name="cronExpression" value="0 0 22 * * ? " /> <!-- 每天22点00分执行处理 -->
</bean>
<!-- 配额履约提醒任务处理 end -->
<!-- 注解定时器 -->
<task:executor id="executor" pool-size="5" />
<task:scheduler id="scheduler" pool-size="10" />
<task:annotation-driven executor="executor" scheduler="scheduler" />
</beans>
public class TicketTaskDo {
@Autowired
private CrTicketTaskManager taskManager;
/**
* 碳票拆分处理
*
* @return
*/
public String unDoTaskList(){
List<CrTicketTask> taskList = taskManager.findUnDoTaskList();
if (taskList != null && !taskList.isEmpty())
for (int i = 0; i < taskList.size(); i++) {
CrTicketTask task = taskList.get(i);
//taskManager.doTask(task);
}
return "";
}
}
package com.zbxsoft.chtrans.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import com.zbxsoft.chtrans.common.ChConfig;
import com.zbxsoft.chtrans.manager.ChDealCoreManager;
import com.zbxsoft.chtrans.quartz.StartQuartzThread;
/**
* @description 构建启动servlet
*
* @author LiuGang
* @email gliu@jinmajia.com
* @version v1.0,2012-02
* @time 12:19:46 PM, Feb 16, 2012
*/
public class InitServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private ChDealCoreManager dealCoreManager;
public void init() throws ServletException {
String task = ChConfig.readString("task");// 执行定时任务开关,在配置文件中配置
if ("1".equals(task)) {
new Thread(new StartQuartzThread()).start();
}
//String jmj_platform = ChConfig.readString("jmj_platform");
//if(dealCoreManager == null){
//dealCoreManager = (ChDealCoreManager)SpringContextHolder.getBean("chDealCoreManager");
//}
//boolean b = dealCoreManager.checkUserInBank(jmj_platform);
//if(!b){
//dealCoreManager.myBankBind(jmj_platform);
//}
}
}
package com.zbxsoft.chtrans.quartz;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.quartz.SchedulerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zbxsoft.chtrans.common.ChConfig;
/**
* @description 启动定时执行任务线程
*
* @author LiuGang
* @email gliu@jinmajia.com
* @version v1.0,2012-02
* @time 12:18:23 PM, Feb 16, 2012
*/
public class StartQuartzThread implements Runnable {
private Logger logger = LoggerFactory.getLogger(this.getClass());
public void run() {
logger.info(new Date() + ":thread start");// 启动定时执行任务线程.
try {
// jobGroupList调度作业组的集合.
List<Map<String, String>> jobGroupList = new ArrayList<Map<String, String>>();
// 一个map为一个调度作业组
Map<String, String> jobGroup1 = new HashMap<String, String>();
// map的key为作业类名,value为触发时间cron表达式.使用map保证一个组内的作业不会重复.
//jobGroup1.put(QuartzNotActivityJob.class.getName(), ChConfig.readString("not_active"));
//jobGroup1.put(QuartzNotOwnerCommTransJob.class.getName(), ChConfig.readString("not_owner_commtrans"));
//jobGroup1.put(QuartzNotOwnerPickUpJob.class.getName(), ChConfig.readString("not_owner_pickup"));
//jobGroup1.put(QuartzOwnerLoseJob.class.getName(), ChConfig.readString("owner_lose"));
//交易作业
Map<String,String> dealQueueJob = new HashMap<String,String>();
dealQueueJob.put(QuartzDealQueueJob.class.getName(), ChConfig.readString("crone_deal_queue"));
jobGroupList.add(jobGroup1);
jobGroupList.add(dealQueueJob);
// 第N个调度作业组,自行添加
CronTriggerRunner.getInstance().task(jobGroupList);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
package com.zbxsoft.chtrans.quartz;
import java.util.Date;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.StatefulJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zbxsoft.chtrans.common.DateTools;
import com.zbxsoft.chtrans.web.controller.deal.ChDealTimerAction;
/**
* @author ysliu
* @version v1.0
* 创建时间:2012-2-17 上午11:23:17
* 交易执行的任务
*/
public class QuartzDealQueueJob implements StatefulJob {
//实现StatefulJob有状态的job,保证串行执行
private Logger logger = LoggerFactory.getLogger(this.getClass());
public void execute(JobExecutionContext arg0) throws JobExecutionException {
try {
// 执行开始时间
//long starttime = System.currentTimeMillis();
doJob();
// 执行结束时间
//long endtime = System.currentTimeMillis();
//logger.info(DateTools.format(new Date(), DateTools.YYYY_MM_DD_HH_MM_SS) + ",process 'autoDealQueue' job in "
//+ (endtime - starttime) + "ms.");
} catch (Exception e) {
e.printStackTrace();
logger.error(DateTools.format(new Date(), DateTools.YYYY_MM_DD_HH_MM_SS) + ",process 'autoDealQueue' job fail:"
+ e.getMessage());
}
}
/**
* 任务动作
*
* @throws Exception
*/
private void doJob() throws Exception {
try {
//logger.info(DateTools.format(new Date(), DateTools.YYYY_MM_DD_HH_MM_SS) + ",processing 'autoDealQueue' job...");
new ChDealTimerAction().autoDealQueue();
} catch (NullPointerException e) {
throw e;
} catch (Exception e) {
throw e;
}
}
}
package com.zbxsoft.chtrans.quartz;
import java.text.ParseException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.quartz.CronExpression;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @description 调度作业执行引擎
*
* @author LiuGang
* @email gliu@jinmajia.com
* @version v1.0,2012-02
* @time 12:49:03 PM, Feb 16, 2012
*/
public class CronTriggerRunner {
private Logger logger = LoggerFactory.getLogger(this.getClass());
// 单例
private static class SingletonHolder {
static CronTriggerRunner instance = new CronTriggerRunner();
}
public static CronTriggerRunner getInstance() {
return SingletonHolder.instance;
}
public void task(List<Map<String, String>> jobGroupList) throws SchedulerException {
// LG:优化了作业的执行代码待,修改成传递List(Map<String,String>)方式,以map来定义一个作业组,map内的所有任务为一组作业,多个map形成多个作业组集合
// map键值对为 <任务类名, cron时间表达式>
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler(); // 获得作业调度器
String jobClassName = "";// 作业类名字
String cron = ""; // 触发器的时间
try {
for (int i = 0; i < jobGroupList.size(); i++) {// 遍历调度作业组
Map<String, String> jobGroup = jobGroupList.get(i); // 获得一个调度作业内的所有job作业
Set<String> set = jobGroup.keySet();// 获得调度作业的类集合
if (!set.isEmpty()) {
int j = 1;
Iterator<String> its = set.iterator();
while (its.hasNext()) {
jobClassName = its.next().toString();
// 触发时间cron表达式
cron = jobGroup.get(jobClassName);
if (cron == null || "".equals(cron.trim())) {
cron = "0 0/1 * * * ?";
}
// 触发时间
CronExpression cexp = new CronExpression(cron);
// 构建一个调度作业,Clazz为要执行的作业
JobDetail jobDetail = new JobDetail(jobClassName, "jobGroup" + i, Class.forName(jobClassName));
// 构建一个触发器
CronTrigger cronTrigger = new CronTrigger("cronTrigger" + j, "triggerGroup" + i);// 触发器
// 设置触发作业的时间
cronTrigger.setCronExpression(cexp);
// 设置执行该作业的触发时间,并加入到调度器中
scheduler.scheduleJob(jobDetail, cronTrigger);
j++;
}
}
}
// 启动作业调度器
scheduler.start();
} catch (SchedulerException e1) {
scheduler.shutdown();
logger.error(e1.getMessage());
} catch (ParseException e) {
scheduler.shutdown();
logger.error("调度作业的触发时间CronExpression表达式错误");
} catch (ClassNotFoundException e) {
scheduler.shutdown();
logger.error("调度作业不存在!请仔细检查作业名称");
}
}
}
Web.xml
<!-- 启动定时任务 -->
<servlet>
<servlet-name>initservlet</servlet-name>
<servlet-class>
com.zbxsoft.chtrans.servlet.InitServlet
</servlet-class>
<load-on-startup>4</load-on-startup>
</servlet>