`

quartz应用之一:创建、关闭定时任务

 
阅读更多

项目需求:

数据迁移进程开始执行后,启动定时任务每隔30秒计算迁移进度,并将进度入库,当迁移完成后,关闭任务。

迁移时根据任务单来执行,任务单中由多种基本业务数据组成。

 

实现思路:

1.迁移开始前,启动监视进度的线程,每30秒重新执行,如果数据迁移完毕,则调用关闭线程接口。

2.基本业务数据迁移完成后,迁移状态及进度入库。

3.任务单执行完毕后,调用关闭线程接口。

 

 

定时任务采用线程方式实现,线程监视迁移进度,和迁移进程同步执行。不采用自己编写线程的方式,是因为系统中很多功能都采用了线程的方式实现,多线程编程还是建议采用应用广泛的线程池来统一管理,否则容易出现多线程的死锁、失控等问题,所以我采用了quartz框架。

 

示例代码:

 

public class MoveProcessService extends BaseMgr {
	public static Logger logger = Logger.getLogger(LoggerManager.PLATFORM);
	public static Map schedulerMap = new HashMap();//计划集合
	private Scheduler scheduler;
	
	public MoveProcessService(){
		try{
			scheduler = StdSchedulerFactory.getDefaultScheduler();//创建scheduler 
		}catch(Exception e){
			logger.error("\n\n^^^^^^^^^^^^^^^^^^^ 创建Scheduler实例异常");
			e.printStackTrace();
		}
	}
	
	/**
	 * job名称和线程组及触发器名称需要动态处理
	 * @param caseId
	 * @param baseTypeIdList
	 */
	public void watchMoveProcess(String caseId,List baseTypeIdList){
		try{
			//***********************************************
			//为当前个例创建一个定时任务来监控迁移进度
			//***********************************************
			//1.创建WatchMoveProcessJob的JobDetail
			JobDetail jobDetail = new JobDetail("WatchMoveProcessJob","MoveProcessGroup",
					com.dhcc.rt.sysMonitor.service.WatchMoveProcessJob.class);
			jobDetail.getJobDataMap().put("caseId", caseId);
			jobDetail.getJobDataMap().put("baseTypeIdList", baseTypeIdList);
			
			WatchMoveListener moveListener = new WatchMoveListener();
			jobDetail.addJobListener(moveListener.getName());
			//jobDetail.setRequestsRecovery(true);//此作业是可恢复的
			
			//2.创建其触发器
			Trigger trigger = TriggerUtils.makeSecondlyTrigger(30);
			trigger.setName("moveProcessTrigger");
			trigger.setStartTime(new Date());
			
			//3.创建并启动任务调度引擎
			scheduler.addJobListener(moveListener);
			scheduler.scheduleJob(jobDetail, trigger);//JobDetail和trigger一同交给引擎去调度
			schedulerMap.put(caseId, scheduler);
			scheduler.start();
			shutdownScheduler(caseId);
			
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 关闭个例进度监视
	 * @param caseId
	 */
	public void shutdownScheduler(String caseId){
		//关闭监视的几个状态:迁移成功、迁移失败
		try{
			int taskOrderStatus = new PorcessMonitorDAO().findTaskOrderStatus(caseId);
			if(taskOrderStatus == 1 || taskOrderStatus == 2){
				logger.info("^^^^^^^^^^^^^^^^^^^ 关闭个例进度监视");
				
				Object schedulerObj = schedulerMap.get(caseId);
				if(schedulerObj != null){
					Scheduler scheduler = (Scheduler)schedulerObj;
					scheduler.shutdown();
				}
			}
		}catch(Exception e){
			logger.error("^^^^^^^^^^^^^^^^^^^ 关闭Scheduler实例异常");
			e.printStackTrace();
		}
	}
	
}

 

job:

小类迁移实际进度入库

porcessMonitorDAO.updateBaseTypeProcess(caseId,baseTypeId,process);

 

public class WatchMoveProcessJob implements Job{
	public static Logger logger = Logger.getLogger(LoggerManager.PLATFORM);
	
	public void execute(JobExecutionContext jec) throws JobExecutionException {
		//读取参数
		JobDataMap dataMap = jec.getJobDetail().getJobDataMap();
		String caseId = dataMap.getString("caseId");
		List baseTypeIdList = (List)dataMap.get("baseTypeIdList");
		logger.info("** caseId = "+ caseId);
		logger.info("** baseTypeIdList = "+ baseTypeIdList);
		
		PorcessMonitorDAO porcessMonitorDAO = new PorcessMonitorDAO();
		MoveStatistic moveStatistic = new MoveStatistic();
		Map moveProcessMap = TCaseData.getMoveProcessMap();
		
		Map baseTypeIds = (Map)moveProcessMap.get(caseId);
		Set baseTypeSet = baseTypeIds.keySet();
		if(baseTypeSet != null){
			for(Iterator its = baseTypeSet.iterator();its.hasNext();){
				String baseTypeId = (String)its.next();
				String process = moveStatistic.getMoveProcess(caseId,baseTypeId);//获取迁移进度:本地文件夹大小/远程数据大小
				//baseTypeIds.put(baseTypeId, process);
				
				//小类迁移进度入库
				process = process.length() > 0 ? process : "0";
				if(new Integer(process).intValue() < 100){
					porcessMonitorDAO.updateBaseTypeProcess(caseId,baseTypeId,process);
				}
			}
		}		
	}	
}

 

http://moppet.taobao.com/

 

1
2
分享到:
评论

相关推荐

    Quartz 定时任务web使用

    Quartz 是一个开源的作业调度框架,常用于Java应用程序中实现定时任务的管理。它提供了丰富的API和功能,使得开发者可以灵活地定义和控制任务的执行。本篇将重点介绍如何在Web环境中集成并使用Quartz,以及相关的...

    java定时任务quartz的基本实现

    Quartz是Java领域中一个广泛使用的开源任务调度框架,它提供了丰富的功能来满足各种定时任务的需求。本篇文章将深入探讨Quartz的基本实现,以及如何在Java项目中运用它。 首先,Quartz的核心概念包括作业(Job)、...

    转:spring多个定时任务quartz配置

    在Spring框架中,Quartz是一个强大的任务调度库,可以用于执行定时任务。本文将深入探讨如何在Spring中配置多个Quartz定时任务,并结合`quartz.properties`文件进行详细讲解。 首先,我们需要理解Quartz的基本概念...

    C#Quartz定时任务

    【C# Quartz定时任务】是基于C#编程语言实现的一种定时任务框架,它允许开发者在.NET环境中创建和管理定时任务。这个项目是在Visual Studio 2010开发环境下编写的,提供了一个可以直接运行的示例(demo),方便快速...

    quartz系列之九:存储

    这对于那些希望在Java应用中实现定时任务或者构建大规模分布式调度系统的开发者来说,是至关重要的知识。 文件名“2256479_Aug-2014.mht”可能是指一篇2014年8月发表的MHT格式的网页存档,内容可能包含了上述讨论的...

    asp.net定时任务(定时器)

    ASP.NET定时任务是Web开发中常见的一种功能,用于在特定时间间隔执行某些操作,例如数据同步、清理缓存、发送通知等。在这个场景下,我们讨论的是如何在ASP.NET环境中设置一个定时器,使得页面加载或IIS启动后,该...

    maven-quartz(定时任务)最简单版本

    【maven-quartz 定时任务简介】 在Java开发中,有时我们需要实现一些定时执行的任务,比如定期备份数据库、发送邮件、执行统计分析等。这时,我们可以借助于Quartz库,一个强大的开源作业调度框架。Quartz允许我们...

    springboot定时任务的动态开启关闭

    在Spring Boot应用中,定时任务是一项非常实用的功能,它允许我们按照预定的时间间隔执行特定的任务。Spring Boot提供了Spring Scheduler抽象来实现这样的需求,使得开发者能够方便地管理和控制定时任务。本篇文章将...

    java定时执行多任务和quartz定时执行多任务

    - `java.util.concurrent.ScheduledExecutorService`: 这是Java并发包中的一个接口,提供了更强大的定时任务管理能力,支持定时和定期执行任务。它通过`ScheduledFuture`接口返回的实例可以取消任务或者获取任务...

    quartz定时任务

    Quartz是一款开源的作业调度框架,它允许在Java应用程序中定义和执行定时任务。Quartz的核心功能在于其灵活的调度机制,使得开发者可以方便地控制任务的执行时间、频率以及并发性。在Spring框架中集成Quartz,可以...

    spring quartz通过xml配置实现定时任务demo

    在Java开发中,Spring框架与Quartz库的结合使用能够帮助开发者轻松地创建和管理定时任务。本示例将详细讲解如何通过XML配置文件来实现Spring与Quartz的集成,从而构建一个定时任务Demo。 首先,Quartz是开源的作业...

    Spring quartz 定时任务调度

    Spring Quartz 是一个强大的开源任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。在Spring框架中集成Quartz,可以充分利用Spring的IoC(Inversion of Control)和AOP(Aspect Oriented Programming...

    数据库管理quartz定时任务

    【数据库管理Quartz定时任务...综上所述,Quartz是一个强大且灵活的定时任务管理工具,结合数据库存储,能有效应对复杂的企业级需求。开发者可以通过配置和编程,轻松地创建和管理各种定时任务,实现自动化的工作流程。

    quartz定时

    Quartz定时是一个在Java开发中广泛使用的开源任务调度框架,它允许开发者定义和执行复杂的定时任务。这个框架的核心功能是创建、管理和执行Job(任务),并配合Trigger(触发器)来决定何时运行这些任务。 首先,...

    Springboot2.0.1整合Quartz动态定时任务

    定义一个JobDetail Bean,它代表一个具体的定时任务: ```java @Bean public JobDetail jobDetail() { return JobBuilder.newJob(MyJob.class) .withIdentity("myJob", "group1") .build(); } ``` 这里`MyJob`是...

    Quartz的简单定时任务小示例

    Quartz是一款广泛使用的开源作业调度框架,它允许开发者在Java应用程序中定义和执行复杂的定时任务。相较于Java内置的`Timer`类,Quartz提供了更强大、更灵活的定时任务管理功能,支持集群环境,能够更好地处理并发...

    任务调度框架Quartz

    Quartz 是一个功能强大且灵活的任务调度框架,广泛应用于各种企业应用中,例如定时清理系统垃圾文件、定时导入导出数据、定时发送邮件等等业务场景。Quartz 提供了高度可控的任务调度功能,能够满足大多数的调度需求...

    Quartz1.7 动态添加、修改和删除定时任务(非spring集成版)

    Quartz是一款功能强大的开源作业调度框架,用于在Java应用程序中创建和管理定时任务。1.7版本是其历史上的一个稳定版本,提供了丰富的API和功能,使得开发者能够灵活地实现定时任务的动态管理,包括添加、修改和删除...

    spring-timer-quartz.zip_namegnd_spring定时任务

    在IT行业中,定时任务是许多应用不可或缺的一部分,用于在特定时间执行特定的业务逻辑,例如数据备份、报表生成等。Spring框架提供了强大的定时任务支持,可以方便地与Spring MVC进行集成,实现灵活的定时任务调度。...

    基于Quartz.Net组件实现定时任务调度-QuartzServer.zip

    Quartz.Net是一个开源的作业调度框架,用于在.NET环境中创建和执行定时任务。它提供了高度可配置性,灵活性和稳定性,使得开发人员可以方便地在应用程序中集成定时任务功能。"基于Quartz.Net组件实现定时任务调度-...

Global site tag (gtag.js) - Google Analytics