Java项目批处理实现方式(Demo)

来源:互联网 发布:mac steam 目录 编辑:程序博客网 时间:2024/06/01 10:16

注:项目架构 springMVC

1. 首先因为启动项目就要启动批处理,所以需要在配置文件(web.xml)进行启动/拦截配置,参考如下:

  <!-- servlet配置 -->  <servlet>    <!-- servlet名称,自定义。尽量有意义 -->    <servlet-name>BatchInitServlet</servlet-name>    <!-- servlet的类全名: 类全路径 -->    <servlet-class>com.ebiz.bus.component.quartz.servlet.BatchInitServlet</servlet-class>    <!-- servlet启动加载顺序 -->    <load-on-startup>3</load-on-startup>  </servlet>  <!-- servlet映射配置,可做重新调度批处理的映射,启动批处理不需要此部分 --><!--     <servlet-mapping> --><!--    <!-- 需要映射的servlet名称,注意与目标servlet名称一致 --> --><!--     <servlet-name>BatchInitServlet</servlet-name> --><!--     servlet的映射地址(映射url路径中包含如下名称的路径) 注意“/”不能丢 --><!--     <url-pattern>/BatchInitServlet</url-pattern> --><!--   </servlet-mapping> -->

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 {    // 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。     // 参考:http://blog.csdn.net/yuexuanyu/article/details/30035153    private static final long serialVersionUID = 1L;    // 打印日志    private static Logger logger = Logger.getLogger(BatchInitServlet.class.getName());    // 创建QuartzService对象    private QuartzService quartzService = null;    public void init() {        logger.info("批处理加载开始");        try {            // 执行基类init()方法            super.init();            // 取spring容器中的任务调度服务bean            // null和对象比较时,放前面比较好哦            if(null == quartzService){                // 读取配置文件获取bean                quartzService = (QuartzService) SpringContext.getBean("quartzServiceImpl");            }            // 调用service初始化批处理            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;@Servicepublic 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;@Componentpublic 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);    }}

注:数据库表中字段大致如下图:

这里写图片描述