`
cn_arthurs
  • 浏览: 327412 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

请您先登录,才能继续操作

spring+quartz执行动态定时任务

阅读更多

  最近做了一个用java实现oracle备份的业务实现,现理清一下思路,做个备份^_^

业务难点:

1.由于要执行的定时任务是可以修改的,也就是动态的,用户可以选择是否要执行自动备份,什么时候备份,间隔多长时间备份一次

首先考虑到用quartz,但是quartz是需要配置的,而且用户如果不想要自动备份需要停止的时候,如果只单单使用quartz是很难办到的,在得到了众多网友的帮助下,终于想通了

思路如下:

使用quartz定义每隔一小时,查询一遍数据库autodb表,autodb表中仅有一条记录,

create table AUTODB
(
  ID         NUMBER(10) not null,
  ISAUTO     CHAR(1) default 0,
  NEXTTIME   DATE,
  TYPE       NUMBER(1) default 1,
  CYC      NUMBER(2) default 1,
  HOUR     NUMBER(2) default 0,
  MINUTE   NUMBER(2) default 0,
  constraint PK_AUTODB primary key (ID)
);
insert into AUTODB(id,isauto,type,cyc) values(1,0,1,1);

/**
	 * 是否备份,0不备份,1备份
	 */
	private String isAuto;
	/**
	 * 开始的小时时间
	 */
	private int hour;
	/**
	 * 开始的分钟时间
	 */
	private int minute;
	/**
	 * 备份的类型,1按天,2按月,3按季度,4按年
	 */
	private int type;
	/**
	 * 间隔周期
	 */
	private int cyc;
	private Date nextTime;

 quartz是在spring下配置的,每个1小时执行一次,内容如下:

<bean name="listenQuartz"
			class="org.springframework.scheduling.quartz.JobDetailBean">
			<property name="jobClass">
				<value>com.ngworld.insurancecard.db.ListenerQuartz</value>
			</property>
			<property name="jobDataAsMap">
			<map>
				<entry key="timeout"><value>5</value></entry>
				<entry key="dmpService"><ref bean="dmpService"/></entry>
			</map>
			</property>
</bean>
<bean name="simpleQuartzTriggerlistenQuartz"
			class="org.springframework.scheduling.quartz.CronTriggerBean">
			<property name="jobDetail">
				<ref bean="listenQuartz"/>
			</property>
			<property name="cronExpression">
				<value>0 0 0 * * ?</value>
			</property>
</bean>

定时器代码:

import java.util.Calendar;
import java.util.Date;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import com.ngworld.insurancecard.service.DMPService;
import com.ngworld.insurancecard.vo.AutoDB;


public class ListenerQuartz extends QuartzJobBean {
	private DMPService dmpService;
	public ListenerQuartz(){}
	protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
		AutoDB db = dmpService.getAutoDB();
		String temp = db.getIsAuto().equals("1")?"是":"否";
		System.out.println("定时检测是否需要备份 : "+temp);
		if(db.getIsAuto().equals("1")){
			Date d = new Date();
			Calendar next1 = Calendar.getInstance();
			next1.setTime(d);
//			next1.add(Calendar.MINUTE, 1);
			next1.add(Calendar.HOUR_OF_DAY, 1);
			next1.add(Calendar.SECOND, 1);
			//获取下一次执行的时间
			Date nexttime = db.getNextTime();
			//如果当前时间在下一次执行时间之后,则需要增加下一次执行时间,直到当前时间在下次执行时间之前
			if(d.after(db.getNextTime())){
				//这里使用while是说明,可能一次的增加无法使下次执行时间大于当前时间,所以要循环增加
				while(d.after(db.getNextTime())){
					db.setNextTime(getNextTime(db));
					if(d.before(db.getNextTime())){
						break;
					}
				}
				//把下一次执行的时间保存到数据库
				dmpService.updateAutoDB2(db);
			}
			Date d2 = next1.getTime();
			//判断当前时间增加1小时后,是否是在下次执行时间之后,如果是,则说明,不到1个小时内就需要执行任务了,
			//所以需要穿件timetask定时器任务,创建一个定时器线程在下次执行的时间执行任务
			if(d2.after(nexttime)){
				TimeTask t = new TimeTask(db.getNextTime(),dmpService);
				t.start();
			}
		}
	}
	public void setDmpService(DMPService dmpService) {
		this.dmpService = dmpService;
	}
	public Date getNextTime(AutoDB db){
		Calendar c = Calendar.getInstance();
		c.setTime(db.getNextTime());
		//1按天,2按月,3按季度,4按年,5按分钟
		if(db.getType()==1){
			c.add(Calendar.DATE, db.getCyc());
		}else if(db.getType() == 2){
			c.add(Calendar.MONTH, db.getCyc());
		}else if(db.getType() == 3){
			c.add(Calendar.MONTH, db.getCyc()*3);
		}else if(db.getType()==4){
			c.add(Calendar.YEAR, db.getCyc());
		}else if(db.getType()==5){
			c.add(Calendar.MINUTE, db.getCyc());
		}
		return c.getTime();
	}
}

 

定时器任务代码:

public class TimeTask {
    private Date date;
    private DMPService dmpService;
    

    public TimeTask(Date _date,DMPService _dmpService) {
    	this.date = _date;
    	this.dmpService = _dmpService;
    }

    public void start() {
        System.out.println("执行定时数据库备份");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm");
        String backupName = sdf.format(date);
        DMP dmp = new DMP();
      	dmp.setName(backupName);
      	SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      	dmp.setTime(sdf2.format(date));
      	dmp.setType("1");
        boolean bool = dmpService.saveDmp(dmp);
      	if(bool){
      	    bool = dmpService.exeBackUp(dmp);
      	}
    }
}

 

3
2
分享到:
评论

相关推荐

    spring+springMVC+mybatis+quartz动态定时任务创建

    Quartz是一个开源的作业调度框架,常用于创建和执行定时任务。在"spring+springMVC+mybatis+quartz动态定时任务创建"项目中,Quartz扮演着关键角色。它可以动态地添加、修改或删除定时任务,这在需要根据业务需求...

    Spring mvc + Mybatis + quartz + swagger 定时任务管理[新增、编辑、删除、修改]

    在构建企业级应用时,经常会遇到需要执行定时任务的需求,比如数据备份、报表生成、邮件发送等。本项目就是基于Spring MVC、Mybatis、Quartz和Swagger实现的一个定时任务管理系统,旨在提供一种灵活且可配置的方式来...

    spring+quartz动态定时任务创建 +mybatis

    **Spring+Quartz动态定时任务创建** 将Spring与Quartz结合,我们可以方便地在运行时动态创建和修改定时任务。首先,我们需要在Spring配置文件中声明一个SchedulerFactoryBean,然后定义JobDetail和Trigger,分别表示...

    spring+quartz定时小例子

    在 "spring+quartz定时小例子" 中,我们主要关注的是如何将这两个框架结合使用,创建一个可以执行定时任务的应用。这个例子包含了相关的框架包和文档,帮助开发者理解并实践这一整合过程。 1. **Spring 配置**: ...

    Spring+Quartz 从数据库中获取定时任务和定时时间,动态实现对定时任务的增删改查

    首先,Quartz是一个开源的作业调度框架,它允许开发者创建、安排和执行定时任务。Quartz支持从数据库存储作业和触发器,这样可以方便地进行任务的持久化和集群环境下的任务同步。 1. **Spring与Quartz的集成**:...

    基于Spring的Quartz动态定时任务增删改查

    基于Spring的Quartz动态定时任务增删改查,代码简洁。后端采用SpringMvc+Spring+Mybatis+Quartz,前端采用Bootstrap框架,数据库采用MySQL;完成定时任务动态任务初始化,增删改查

    spring+quartz实现动态设置定时任务

    Spring和Quartz是两个强大的工具,可以协同工作来实现动态管理的定时任务。本文将深入探讨如何利用Spring框架和Quartz库创建和管理这些任务。 **Spring框架** 是一个广泛应用的Java企业级开发框架,它提供了丰富的...

    基于SSM+quartz的定时任务管理demo

    本Demo以"基于SSM+quartz的定时任务管理"为主题,将展示如何在Spring、SpringMVC和MyBatis(SSM)框架基础上,集成Quartz作为调度引擎,实现高效灵活的定时任务管理。 **1. SSM框架简介** SSM是Spring、SpringMVC...

    spring3.0+quartz-1.6.0定时

    Spring 3.0 和 Quartz 1.6.0 结合使用是企业级应用中常见的定时任务解决方案。Spring 是一个强大的Java应用程序框架,提供了依赖注入、AOP(面向切面编程)以及众多其他功能,而Quartz则是一个开源的作业调度框架,...

    定时框架spring+quartz

    "定时框架spring+quartz"的结合,就是将Quartz的定时功能与Spring的强大集成能力完美融合,为开发者提供了一种高效、灵活的定时任务解决方案。 Spring框架提供了多种方式来管理定时任务,包括使用Spring的`@...

    spring+quartz实现定时任务动态管理

    Spring框架结合Quartz库,提供了一种强大而灵活的方式来管理这些定时任务。本项目旨在实现对Quartz定时任务的动态管理,包括添加、停止和恢复等操作。前端采用jQuery和Bootstrap构建,提供用户友好的可视化界面,...

    spring+quartz 动态任务方案

    综上所述,Spring + Quartz 动态任务方案提供了一个灵活且高效的方式来管理定时任务。通过 Spring 容器的管理,使得任务的定义和调度变得更加便捷。同时,通过自定义的 `SchedulerService` 接口和其实现,可以实现对...

    spring+quartz动态设置定时时间

    总之,通过Spring与Quartz的整合,我们可以实现动态的定时任务管理,这在实际业务中非常有用。无论是通过API动态调整,还是利用数据库存储,都能满足不同场景的需求。同时,了解和掌握各个版本间的兼容性以及最佳...

    spring+mvc+quartz.rar

    本教程将详细讲解如何利用Spring 4.3.15、Spring MVC 4.3.15和Quartz 2.2,构建一个可管理的定时任务系统,包括任务的暂停、启动、立即执行和重新调度等功能。 一、Spring MVC与Quartz简介 1. Spring MVC:是...

    Spring+Quartz example

    这篇描述提到了一个Spring+Quartz的示例项目,它展示了如何在Spring应用中集成Quartz来实现定时任务。通过提供的博客链接(http://blog.csdn.net/u010397369/article/details/17465649),我们可以了解到具体的操作...

    spring+quartz定时集群支持

    Spring整合Quartz库,使得我们可以方便地在Spring应用中创建、管理和执行定时任务。Quartz是一个开源的作业调度框架,能够安排和执行复杂的定时任务。 在集群环境下,Spring+Quartz的配置需要考虑如何处理多个...

    spring+quartz+javamail定时发送邮件

    在IT行业中,定时任务是许多系统不可或缺的一部分,用于执行周期性的任务,如数据备份、报告生成或消息通知。本项目“spring+quartz+javamail定时发送邮件”结合了Spring框架、Quartz调度器以及JavaMail API,构建了...

    spring2.0 Quartz 执行每天定时任务 普通普是执行任务

    要在Spring 2.0中使用Quartz执行每天定时任务,你需要按照以下步骤进行: 1. 引入依赖:在项目中添加Quartz的库依赖,通常通过Maven或Gradle进行管理。 2. 配置Quartz:在Spring的配置文件(如`applicationContext...

    Spring+Quartz定时任务学习文档+实例+jar包

    Spring提供了一个轻量级的容器来管理Bean,而Quartz则是一个强大的作业调度库,能够帮助开发者定义和执行定时任务。下面我们将深入探讨这两个技术的结合以及Quartz的相关知识点。 首先,Spring集成Quartz主要通过...

    spring+quartz demo

    通过这个 "spring+quartz demo",开发者可以快速理解并实践 Spring 和 Quartz 的整合,掌握如何在 Spring 应用中高效地管理和执行定时任务。这个示例项目提供了直接运行的代码,有助于加深对这些概念的理解。

Global site tag (gtag.js) - Google Analytics