注:项目架构 springMVC
1. 首先因为启动项目就要启动批处理,所以需要在配置文件(web.xml)进行启动/拦截配置,参考如下:
<servlet>
<servlet-name>BatchInitServlet</servlet-name>
<servlet-class>com.ebiz.bus.component.quartz.servlet.BatchInitServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
-->
2. 启动项目会自动按顺序加载com.ebiz.bus.component.quartz.servlet.BatchInitServlet,并调用init()方法。(注:servle生命周期,创建Servlet对象 -> 调用Servlet对象的init() -> 响应请求,调用service()或者是doGet() -> 调用destroy()方法来销毁Servlet对象)
package com.ebiz.bus.component.quartz.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import com.ebiz.bus.component.quartz.service.QuartzService;
import com.ebiz.platform.context.SpringContext;
/**
* 启动应用批处理servlet
*/
public class BatchInitServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(BatchInitServlet.class.getName());
private QuartzService quartzService = null;
public void init() {
logger.info("批处理加载开始");
try {
super.init();
if(null == quartzService){
quartzService = (QuartzService) SpringContext.getBean("quartzServiceImpl");
}
quartzService.initScheduler();
} catch (Exception e) {
logger.info("批处理加载失败,请手动加载!", e);
}
logger.info("批处理加载结束");
}
}
package com.ebiz.bus.component.quartz.service;
import java.util.List;
import com.ebiz.bus.common.generated.model.EbizBatchInfo;
/**
* 批处理调度service
*/
public interface QuartzService {
/**
* 初始化批处理,从配置中加载批处理项
* @param type 标识调度类型,INIT:初始化调度
* @throws Exception
*/
public void initScheduler() throws Exception;
}
package com.ebiz.bus.component.quartz.service
import java.util.List
import javax.annotation.Resource
import org.apache.commons.lang.StringUtils
import org.springframework.stereotype.Service
import com.ebiz.bus.common.constants.QuartzConstant
import com.ebiz.bus.common.generated.model.EbizBatchInfo
import com.ebiz.bus.component.quartz.bo.QuartzBo
import com.ebiz.bus.component.quartz.dto.QuartzJobDTO
import com.ebiz.bus.component.quartz.util.QuartzJob
import com.ebiz.bus.component.quartz.util.QuartzPoolJob
import com.ebiz.bus.component.quartz.util.QuartzSectionPoolJob
import com.ebiz.bus.component.quartz.util.QuartzUtil
import com.ebiz.platform.base.service.impl.BaseServiceImpl
import com.ebiz.platform.config.Config
import com.ebiz.platform.util.ServerConfigUtil
@Service
public class QuartzServiceImpl extends BaseServiceImpl implements QuartzService {
private QuartzUtil quartzUtil
private QuartzBo quartzBo
private Config config
// set注入方式
@Resource
public void setQuartzUtil(QuartzUtil quartzUtil) {
this.quartzUtil = quartzUtil
}
// set注入方式
@Resource
public void setQuartzBo(QuartzBo quartzBo) {
this.quartzBo = quartzBo
}
// set注入方式
@Resource
public void setConfig(Config config) {
this.config = config
}
public void initScheduler() throws Exception {
String path = config.getConfigFileDir()
List<EbizBatchInfo> batchList = null
//取批处理定义信息,根据业务自定去数据库表中查询需要执行的批处理,得到batchList
if (StringUtils.isNotEmpty(path)) {
String runFlag = ServerConfigUtil.getPropValue(path, ServerConfigUtil.BATCH_RUN_KEY)
if (!QuartzConstant.BATCH_NOT_RUN.equals(runFlag)) {
batchList = quartzBo.queryBatchFromConfig(runFlag)
}
}
//逐笔设置任务信息到quartz,并调度任务
if (null != batchList && batchList.size() > 0) {
for (EbizBatchInfo batchInfo : batchList) {
QuartzJobDTO job = new QuartzJobDTO()
// 根据查询出的信息获取类名以及方法名
job.getJobDataMap().put(QuartzJob.OBJECT_NAME, batchInfo.getObjectName())
job.getJobDataMap().put(QuartzJob.OBJECT_METHOD, batchInfo.getObjectMethod())
//单线程方式执行任务
logger.info("单线程执行任务" + batchInfo.getObjectName() + "." + batchInfo.getObjectMethod())
job.setJobClass(QuartzJob.class)
job.setCronExpression(batchInfo.getExecuteTime())
String jobName = batchInfo.getName() +"_" + batchInfo.getId()
job.getJobDataMap().put(QuartzJob.OBJECT_ID, batchInfo.getObjectMethod())
job.setJobName(jobName)
logger.info("----开始部署任务:" + jobName)
quartzUtil.scheduleCronJob(job)
logger.info("----成功部署任务:" + jobName)
}
logger.info("批处理提取并调度完成")
}
}
}
package com.ebiz.bus.component.quartz.util
import javax.annotation.Resource
import org.quartz.Scheduler
import org.springframework.scheduling.quartz.CronTriggerBean
import org.springframework.scheduling.quartz.JobDetailBean
import org.springframework.scheduling.quartz.SimpleTriggerBean
import org.springframework.stereotype.Component
import com.ebiz.bus.component.quartz.dto.QuartzJobDTO
@Component
public class QuartzUtil {
private Scheduler scheduler
@Resource
public void setScheduler(Scheduler scheduler) {
this.scheduler = scheduler
}
public void scheduleCronJob(QuartzJobDTO quartzJobDTO) throws Exception {
// 创建一个job
JobDetailBean jobDetail = createJobDetail(quartzJobDTO)
scheduler.addJob(jobDetail, true)
// 创建一个定时器
CronTriggerBean trigger = new CronTriggerBean()
trigger.setCronExpression(quartzJobDTO.getCronExpression())
trigger.setJobDetail(jobDetail)
trigger.setName(quartzJobDTO.getJobName())
trigger.setJobName(jobDetail.getName())
scheduler.scheduleJob(trigger)
}
}
注:数据库表中字段大致如下图:
