Spring整合quart 实现动态配置定时任务

需求原型:定时发送邮件给指定保险公司业务数据清单

实现方式:

1、定义任务管理器类

package com.hy.core.quartz;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;

import com.hy.core.model.SchedulingJob;

/**
 * 轮询任务管理控制器
 * @author zhangshuhu
 */
public class QuartzManager {

	protected final Log log = LogFactory.getLog(getClass());

	/**
	 * 任务管理器工厂 
	 */
	private Scheduler schedulerFactory;

	/** 
	 * Description:启动一个自定义的job 
	 * Date:2013-12-31 
	 * @author zhangshuhu
	 * @param schedulingJob
	 * @param paramsMap
	 * @param isStateFull
	 * @return
	 */
	public boolean enableCronSchedule(SchedulingJob schedulingJob, JobDataMap paramsMap, boolean isStateFull) {
		if (schedulingJob == null) {
			return false;
		}
		log.info("/**********启动一个自定义任务*********/");
		String statefullexecuteClass = schedulingJob.getStatefulljobexecuteclass();
		String executeClass = schedulingJob.getJobexecuteclass();
		String jobClass = null;
		if (isStateFull) {
			jobClass = statefullexecuteClass;
		} else {
			jobClass = executeClass;
		}
		log.info("/**********任务No: " + schedulingJob.getJobno() + " *********/");
		log.info("/**********任务group: " + schedulingJob.getJobgroup() + " *********/");
		log.info("任务执行类: " + jobClass);
		try {
			JobDetail jobDetail = getJobDetail(schedulingJob.getJobno(), schedulingJob.getJobgroup());
			if (jobDetail == null) {
				jobDetail = new JobDetail(schedulingJob.getJobno(), schedulingJob.getJobgroup(), Class.forName(jobClass));
				jobDetail.setJobDataMap(paramsMap);
				CronTrigger trigger = new CronTrigger(schedulingJob.getJobno(), schedulingJob.getJobgroup(), schedulingJob.getCronexpression());
				schedulerFactory.scheduleJob(jobDetail, trigger);
			} else {
				log.info("任务已经被触发,无需在启用!");
			}
		} catch (Exception e) {
			log.error(e);
			return false;
		}
		log.info("/**********启动一个自定义任务结束,将在" + schedulingJob.getCronexpression() + "规则下触发*********/");
		return true;
	}

	/** 
	 * Description:禁用一个job 
	 * Date:2013-12-31 
	 * @author zhangshuhu
	 * @param jobNo
	 * @param jobGroup
	 * @return
	 */
	public boolean disableSchedule(String jobNo, String jobGroup) {
		log.info("/**********禁用一个自定义任务*********/");
		if (jobNo.equals("") || jobGroup.equals("")) {
			return false;
		}
		try {
			log.info("/**********禁用一个自定义任务*********/");
			log.info("/**********任务No: " + jobNo + " *********/");
			log.info("/**********任务group: " + jobGroup + " *********/");
			Trigger trigger = getJobTrigger(jobNo, jobGroup);
			if (null != trigger) {
				schedulerFactory.deleteJob(jobNo, jobGroup);
			}
		} catch (SchedulerException e) {
			log.error(e);
			return false;
		}
		return true;
	}

	/** 
	 * Description:得到job的详细信息 
	 * Date:2013-12-31 
	 * @author zhangshuhu
	 * @param jobId
	 * @param jobGroupId
	 * @return
	 */
	public JobDetail getJobDetail(String jobId, String jobGroupId) {
		if (jobId.equals("") || jobGroupId.equals("") || null == jobId || jobGroupId == null) {
			return null;
		}
		try {
			return schedulerFactory.getJobDetail(jobId, jobGroupId);
		} catch (SchedulerException e) {
			e.printStackTrace();
			return null;
		}
	}

	/** 
	 * Description:得到job对应的Trigger 
	 * Date:2013-12-31 
	 * @author zhangshuhu
	 * @param @param jobId 
	 * @param @param jobGroupId 
	 * @param @return 
	 * @return Trigger 
	 */
	public Trigger getJobTrigger(String jobNo, String jobGroup) {
		if (jobNo.equals("") || jobGroup.equals("") || null == jobNo || jobGroup == null) {
			return null;
		}
		try {
			return schedulerFactory.getTrigger(jobNo, jobGroup);
		} catch (SchedulerException e) {
			log.error(e);
			return null;
		}
	}

	public void setSchedulerFactory(Scheduler schedulerFactory) {
		this.schedulerFactory = schedulerFactory;
	}
}

2、定义任务执行类

package com.hy.job;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipOutputStream;

import net.sf.excelutils.ExcelUtils;

import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean.StatefulMethodInvokingJob;

import com.hy.constant.Symbols;
import com.hy.core.engine.MailEngine;
import com.hy.domain.MailInfo;
import com.hy.model.InscompanyJob;
import com.hy.service.CusDomesticApplyTcManager;
import com.hy.service.InscompanyJobManager;
import com.hy.util.BusinessNoGenerateUtil;
import com.hy.util.DateUtil;
import com.hy.util.ResourceUtils;
import com.hy.util.ServiceLocator;
import com.hy.webapp.util.FileUtil;
import com.hy.webapp.vo.QueryCusApplypolicyVo;
import com.hy.webapp.vo.SearchCredApplypolicyVo;

/**
 * 发送邮件到保险公司
 * @author zhangshuhu
 */
public class SendMailToInscompanyJob extends StatefulMethodInvokingJob {

	protected Logger log = Logger.getLogger(SendMailToInscompanyJob.class);

	public void executeInternal(JobExecutionContext context) throws JobExecutionException {
		JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
		Long inscompanyjobid = jobDataMap.getLong(Symbols.JOB_PARAM_INSCOMPANYJOBID);
		String inscompanycode = jobDataMap.getString(Symbols.JOB_PARAM_INSCOMPANYCODE);
		String inscompanyname = jobDataMap.getString(Symbols.JOB_PARAM_INSCOMPANYNAME);
		String[] emails = jobDataMap.getString(Symbols.JOB_PARAM_INSCOMPANYEMAIL) == null ? null : jobDataMap.getString(Symbols.JOB_PARAM_INSCOMPANYEMAIL)
				.split(",");
		InscompanyJobManager inscompanyJobManager = ServiceLocator.getService(InscompanyJobManager.class);
		InscompanyJob inscompanyJob = inscompanyJobManager.get(inscompanyjobid);
		if (emails != null) {
			log.info("/**********发送货运险申报清单至保险公司 " + inscompanyname + " 任务开始执行");
			CusDomesticApplyTcManager cusDomesticApplyTcManager = ServiceLocator.getService(CusDomesticApplyTcManager.class);
			SearchCredApplypolicyVo queryvo = new SearchCredApplypolicyVo();
			queryvo.setQueryAll(true);
			queryvo.setLastJobTime(inscompanyJob.getLastdate());
			queryvo.setInscompanycode(inscompanycode);
			try {
				String fileno = BusinessNoGenerateUtil.generateBillSerialno("POLICY");
				List<QueryCusApplypolicyVo> list = cusDomesticApplyTcManager.queryCusApplypolicyVoWithPagination(queryvo);
				if (CollectionUtils.isNotEmpty(list)) {
					inscompanyJob.setLastdate(new Date());
					String insurancereportPath = ResourceUtils.getMessage(Symbols.RESOURCE_TYPE_SYS, "excel.insurancereport.template");
					String policyzippath = ResourceUtils.getMessage(Symbols.RESOURCE_TYPE_SYS, "profile.hbbcargodomestic.uploadRoot");
					String emailreportPath = ResourceUtils.getMessage(Symbols.RESOURCE_TYPE_SYS, "mail.insurancereport.template");
					File fTempDir = new File(policyzippath + "\\temp");
					if (!fTempDir.exists()) {
						fTempDir.mkdirs();
					}
					File fTemp = File.createTempFile("generaldata", ".xls", fTempDir);

					String fileName = fileno + ".xls";
					FileOutputStream out = new FileOutputStream(fTemp);
					ExcelUtils.addValue("policyInfoList", list);
					ExcelUtils.export(insurancereportPath, out);
					out.close();//关闭流
					File fzipTemp = null;
					File fInscompDir = new File(policyzippath + inscompanycode);//创建保险公司货运险申报压缩目录
					if (!fInscompDir.exists()) {
						fInscompDir.mkdirs();
					}
					fzipTemp = new File(policyzippath + inscompanycode + "\\" + fileno + ".zip");
					FileOutputStream zipfileOut = new FileOutputStream(fzipTemp);
					ZipOutputStream zos = new ZipOutputStream(zipfileOut);
					FileUtil.zipFile(fileName, fTemp, zos);

					//删除临时文件
					fTemp.delete();

					MailEngine mailEngine = ServiceLocator.getService(MailEngine.class);
					MailInfo mailSenderInfo = new MailInfo();
					mailSenderInfo.setSubject("货运险申报邮件");
					Map<String, Object> model = new HashMap<String, Object>();
					model.put(Symbols.JOB_PARAM_INSCOMPANYNAME, jobDataMap.getString(Symbols.JOB_PARAM_INSCOMPANYNAME));
					model.put(Symbols.JOB_PARAM_INSCOMPANYLINKER, jobDataMap.getString(Symbols.JOB_PARAM_INSCOMPANYLINKER));
					model.put(Symbols.JOB_PARAM_INSCOMPANYEMAIL, jobDataMap.getString(Symbols.JOB_PARAM_INSCOMPANYEMAIL));
					model.put(Symbols.JOB_PARAM_CURDATE, DateUtil.convertDateToString(DateUtil.getSimpleDatePattern(), new Date()));
					mailSenderInfo.setModel(model);
					mailSenderInfo.setRecipients(emails);
					mailSenderInfo.setTemplate(emailreportPath);
					List<File> attachmentList = new ArrayList<File>();
					attachmentList.add(fzipTemp);
					mailSenderInfo.setAttachmentList(attachmentList);
					mailEngine.sendWithAttachmentTemplate(mailSenderInfo);
				} else {
					log.info("/**********发送货运险申报清单至保险公司 " + inscompanyname + " 任务执行完毕,当前没有需要申报的数据*********/");
				}
				log.info("/**********发送货运险申报清单至保险公司 " + inscompanyname + " 任务执行完毕*********/");
			} catch (Exception e) {
				log.error("/**********发送货运险申报清单至保险公司 " + inscompanyname + " 任务执行出现异常*********/");
				log.error(e);
			}
		} else {
			log.info("/**********发送货运险申报清单至保险公司 " + inscompanyname + " 任务执行出现异常,目的邮箱为空*********/");
		}
		//更新上次同步时间为最新
		inscompanyJobManager.save(inscompanyJob);
	}
}

3、XML相关配置

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xsi:schemaLocation="
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
    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/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
    http://www.springframework.org/schema/jee
    http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">

	<!-- 任务工厂类 -->
	<bean name="schedulerFactory"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	</bean>

	<!-- 自定义任务管理器 -->
	<bean name="quartzManager" class="com.hy.core.quartz.QuartzManager">
		<property name="schedulerFactory" ref="schedulerFactory"></property>
	</bean>

</beans>



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值