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); }}
注:数据库表中字段大致如下图:
阅读全文
0 0
- Java项目批处理实现方式(Demo)
- java线程池实现批处理的简单demo
- 批处理方式设置java环境变量
- 实现Flex与Java的通信的Demo(BlazeDS方式)
- java实现sql语句批处理
- 批处理实现添加java环境变量
- android-async-http开源项目的GET方式或POST方式实现登陆案例简单Demo
- JAVA项目实战学习笔记之批处理
- JDBC数据批处理demo
- 使用命令行方式或者批处理方式启动java程序
- 两种线程实现方式及demo
- Java web项目换页的简单实现方式
- java方式来写js程序(demo)
- java 实现DES加密 demo
- Java实现发送邮件demo
- java 实现文件复制demo
- JAVA数据库连接池实现demo
- java 实现 redis 入门demo
- 仿Iphone刘海效果
- 数据库测试的测试点
- iOS label根据显示内容自适应大小
- Could not write to output file 'c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Fi
- 深入理解javascript原型链
- Java项目批处理实现方式(Demo)
- 防火墙-模式
- A
- 求最大公约数和最小公倍数的常用解法
- jar与zip有什么区别?
- GoogLeNet网络结构学习
- windows ping 虚拟机linux系统出现请求超时
- CDocTemplate::GetDocString
- STM32实验1:定时器中断同时产生两路不同频率的信号