需求原型:定时发送邮件给指定保险公司业务数据清单
实现方式:
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>