java 定时任务

来源:互联网 发布:医药器械软件 编辑:程序博客网 时间:2024/04/30 04:19

定时任务:

<?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>

原创粉丝点击