参见上一篇Spring+ quartz 多任务定时 执行 与cronExpression表达式 可以知道如何设置多个规则的定时任务,但有时需要客户自己设置指定的时间来启动新的任务处理不同的事情。
实现方式:用户在前台自行维护任务列表和任务执行时间,后台将任务执行时间解析成对应的cronexpression后与任务列表一起保存到数据库中。在 服务器运行期间添加的任务通过验证的(quartz会验证cronexpression是否合法以及对应时间是否已经过期)将直接添加一个任务以及触发器。
简而言之,就是自己创建一个新的jobdetail ---新的 Trigger 指定行的定时规则--启动新增定时器任务 (执行完新任务可以选择取消新的任务)
这里实现的思路是:按照定时规则扫描用户设置的任务开始时间,如定时发短信,有定时的就发出去。
1、首先加入定时规则扫描的任务,
package net.nilm61.timeTask; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Locale; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import net.nilm61.entity.Repay; import net.nilm61.service.RepayService; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.springframework.context.ApplicationContext; import org.springframework.orm.jpa.EntityManagerHolder; import org.springframework.scheduling.quartz.QuartzJobBean; import org.springframework.transaction.support.TransactionSynchronizationManager; public class AutoRepayBidTask extends QuartzJobBean{ private RepayService repayService; public void setRepayService(RepayService repayService) { this.repayService = repayService; } @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { EntityManagerFactory emf = null; EntityManager em = null; //System.out.println("Start!!!!!!!!!"); try{ Scheduler scheduler = context.getScheduler(); ApplicationContext ac = (ApplicationContext)scheduler.getContext().get("theScheduler"); emf = (EntityManagerFactory) ac.getBean("entityManagerFactory", EntityManagerFactory.class); em = emf.createEntityManager(); TransactionSynchronizationManager.bindResource(emf, new EntityManagerHolder(em)); RepayService repayService = (RepayService)ac.getBean("recordService"); setRepayService(repayService); doBiz(scheduler); }catch(Exception e){ e.printStackTrace(); //logger.error(e.getMessage()); }finally{ //System.out.println("over!!!!!!!!!!!!!!!!!"); if(em!=null){ em.close(); } } } private void doBiz(Scheduler scheduler) { try{ List<Repay> repays = repayService.getByAutoRepay(); //从数据库中查询定时处理的条目 if(repays != null && repays.size() >0){ DateFormat df = new SimpleDateFormat("ss mm HH dd MM ? yyyy ",Locale.ENGLISH); for(Repay repay : repays){ Date actualTime =repay.getActualTime(); if(actualTime != null){ String cronExpression = df.format(actualTime); //新建任务,任务组为默认的Scheduler.DEFAULT_GROUP,需要执行的任务类为DoBiz4TestTask.class JobDetail jobDetail = new JobDetail("AutoRepayBidsJob_" + repay.getId(), Scheduler.DEFAULT_GROUP, DoBiz4TestTask.class); CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger( "AutoRepayBidsTrigger_"+repay.getId(), Scheduler.DEFAULT_GROUP); if(cronTrigger == null){ //新建触发器,触发器为默认的Scheduler.DEFAULT_GROUP cronTrigger = new CronTrigger("AutoRepayBidsTrigger_" + repay.getId(), Scheduler.DEFAULT_GROUP); } //为触发器设置定时表达式 cronTrigger.setCronExpression(cronExpression); // System.out.println(cronExpression); try{ //启动新增定时器任务 scheduler.scheduleJob(jobDetail, cronTrigger); }catch(SchedulerException e){ //启动验证失败,设置任务标记为禁用 e.printStackTrace(); } } } } }catch(Exception e){ e.printStackTrace(); } } }
2.增加DoBiz4TestTask (具体执行的定时任务)
所有的触发器执行的任务类均为DoBiz4TestTask.class,DoBiz4TestTask 需要实现接口:org.quartz.Job中的方法execute方法,这里继承的是org.quartz.Job的子类org.springframework.scheduling.quartz.QuartzJobBean 参考代码如下
package net.nilm61.timeTask; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.Scheduler; import org.quartz.Trigger; import org.springframework.context.ApplicationContext; import org.springframework.orm.jpa.EntityManagerHolder; import org.springframework.scheduling.quartz.QuartzJobBean; import org.springframework.transaction.support.TransactionSynchronizationManager; public class DoBiz4TestTask extends QuartzJobBean{ @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { EntityManagerFactory emf = null; EntityManager em = null; try{ Scheduler scheduler = context.getScheduler(); ApplicationContext ac = (ApplicationContext)scheduler.getContext().get("theScheduler"); Trigger trigger = context.getTrigger(); emf = (EntityManagerFactory) ac.getBean("entityManagerFactory", EntityManagerFactory.class); em = emf.createEntityManager(); TransactionSynchronizationManager.bindResource(emf, new EntityManagerHolder(em)); doBiz(scheduler,trigger); }catch(Exception e){ e.printStackTrace(); //logger.error(e.getMessage()); }finally{ if(em!=null){ em.close(); } } } private void doBiz(Scheduler scheduler,Trigger trigger) { try{ //获取触发器名称 String triggerName = trigger.getName(); //根据触发器名称得到对应的任务Id // Integer id = Integer.valueOf(triggerName.split("_")[1]); //处理指定的任务 //TODO: ... System.out.println("triggerName === "+triggerName); //根据触发器名称得到对应的任务Id if(null != trigger){ //执行完移除该任务 scheduler.unscheduleJob(trigger.getName(), trigger.getGroup()); } }catch(Exception e){ e.printStackTrace(); } } }
3.配置文件中加入
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="net.nilm61.timeTask.DoAutoRepayBidTask"/> <!-- <property name="jobDataMap" ></property> --> </bean> <bean id="DoBiz4TestTask" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="net.nilm61.timeTask.DoBiz4TestTask"/> <!-- <property name="jobDataMap" ></property> --> </bean> <bean id="AutoRepayTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="jobDetail"/> <property name="cronExpression" value="0 0/1 14-18 * * ?"/> </bean> <bean id="DoBiz4TestTaskss" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="DoBiz4TestTask"/> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="AutoRepayTrigger"/> </list> </property> <property name="applicationContextSchedulerContextKey"> <value>theScheduler</value> </property> </bean>
相关推荐
在IT行业中,构建高效、可扩展的Web应用是至关重要的,而"spring+springMVC+mybatis+quartz动态定时任务创建"就是一个常见的技术栈,用于实现这样的目标。这个组合充分利用了各组件的优势,提供了强大的后端服务支持...
Spring框架是Java领域最流行的应用框架之一,而Quartz则是广受欢迎的定时任务调度库。"定时框架spring+quartz"的结合,就是将Quartz的定时功能与Spring的强大集成能力完美融合,为开发者提供了一种高效、灵活的定时...
Spring和Quartz是两个强大的工具,可以协同工作来实现动态管理的定时任务。本文将深入探讨如何利用Spring框架和Quartz库创建和管理这些任务。 **Spring框架** 是一个广泛应用的Java企业级开发框架,它提供了丰富的...
Spring和Quartz是Java开发中常用的两个框架,它们在企业级应用中被广泛用于实现定时任务的管理和执行。Spring提供了一个轻量级的容器来管理Bean,而Quartz则是一个强大的作业调度库,能够帮助开发者定义和执行定时...
通过这个 "spring+quartz demo",开发者可以快速理解并实践 Spring 和 Quartz 的整合,掌握如何在 Spring 应用中高效地管理和执行定时任务。这个示例项目提供了直接运行的代码,有助于加深对这些概念的理解。
以下将详细介绍如何利用Spring和Quartz实现多任务的定时功能。 ### 1. 引入依赖 首先,我们需要在项目中引入Quartz库和Spring的相关依赖。如果是Maven项目,可以在pom.xml文件中添加如下依赖: ```xml ...
在IT行业中,Spring框架是Java企业级应用开发的首选,而Quartz则是一个强大的任务调度库,常用于实现定时任务。本篇文章将深入探讨如何在Spring环境中集成Quartz以构建一个高可用的集群。 首先,我们需要理解Spring...
Spring框架与Quartz库的结合为开发者提供了强大的定时任务管理能力,尤其在集群环境中,如何确保任务的正确性和一致性成为了一个关键问题。本篇将深入探讨"Spring+Quartz定时集群支持"这一主题。 首先,Spring是...
java + quartz实现定时任务,实现集群配置,在集群环境下多节点运行定时Quartz定任务,就会存在重复处理任务的现象,为解决这一问题,下面我将介绍使用 Quartz 的 TASK ( 12 张表)实例化到数据库,基于数据库自动...
通过以上步骤,我们就能在Spring应用程序中使用Quartz进行定时任务的调度。这使得我们能够方便地管理和控制应用程序中的后台任务,提高了代码的可维护性和灵活性。实际项目中,你可能还需要考虑如何处理异常,以及在...
总之,"Spring Boot + Quartz 动态管理 分布式"的主题涵盖了Spring Boot的快速开发特性,Quartz的定时任务调度能力,以及在分布式环境下的任务管理。通过学习和实践,开发者能够构建出一个灵活、健壮的定时任务系统...
在Java世界中,实现定时任务调度是非常常见的需求,Spring框架结合Quartz库提供了一种高效且灵活的解决方案。本文将深入探讨Spring与Quartz的整合,以及如何利用它们来创建和管理定时任务。 ### 一、Spring与Quartz...
在这个“quartz_springbatch_dynamic”项目中,我们将看到如何将这两个强大的工具结合起来,以实现动态集群环境中的定时任务执行,并使用MySQL作为数据存储。 Quartz是一个开源的作业调度框架,允许开发者创建、...
本项目“Springboot2-Quartz 后台可动态配置的定时任务”是基于SpringBoot 2.x版本与Quartz Scheduler整合的一个示例,它展示了如何在后台管理系统中动态地创建、更新和删除定时任务,以及监控这些任务的状态,为...
在 Spring 中,我们可以利用 Spring 的 Job 和 Trigger 接口来创建和管理定时任务,但这需要较多的手动配置。因此,更常见的是通过集成 Quartz2 来利用其强大的调度功能。 Quartz2 提供了灵活的定时任务管理,包括 ...
总之,通过Spring与Quartz的整合,我们可以实现动态的定时任务管理,这在实际业务中非常有用。无论是通过API动态调整,还是利用数据库存储,都能满足不同场景的需求。同时,了解和掌握各个版本间的兼容性以及最佳...
在IT行业中,定时任务是许多系统不可或缺的一部分,用于执行周期性的任务,如数据备份、报告生成或消息通知。本项目“spring+quartz+javamail定时发送邮件”结合了Spring框架、Quartz调度器以及JavaMail API,构建了...
在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而Quartz则是一个强大的、开源的作业调度框架,常用于实现定时任务。本文将深入探讨如何将Spring MVC与Quartz结合,以及如何利用数据库来动态管理定时...
【Spring+Quartz定时任务最简集群版1】是一个基于Spring和Quartz的定时任务解决方案,用于在分布式环境中实现任务的自动调度。本项目作为Dubbo工程的一部分,它依赖于Dubbo的一些公共组件,同时也提供了将定时任务...
Spring整合Quartz 2.2.3是...总之,Spring与Quartz的整合使得我们能够便捷地在Spring应用中实现复杂的定时任务管理。通过深入理解Quartz的工作原理和Spring的整合机制,开发者可以更好地控制和扩展应用的定时任务功能。