一、spring整合
网上一搜有很多整合的方式,这里我采用了其中的一种(暂时还没有对其他的方法研究过)。
对于spring的整合其中的任务,spring提供了几个类、接口(这些类都实现了Job接口):
org.springframework.scheduling.quartz.QuartzJobBean
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean.MethodInvokingJob
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean.StatefulMethodInvokingJob
QuartzJobBean和MethodInvokingJob是无状态的,StatefulMethodInvokingJob是有状态的。
可以选择自己的需求选择继承与哪个类。
关于Scheduler在Spring上的配置:
<bean name="quartzScheduler" lazy-init="false" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="applicationContextSchedulerContextKey" value="applicationContextKey" /> <property name="autoStartup" value="true" /> <property name="configLocation" value="classpath:spring/quartz.properties"/> </bean>
注意:其中lazy-init="false",和 <property name="autoStartup" value="true"/>最好按照自己的需求作统一的配置
二、quartz.properties 配置持久化的信息
# Default Properties file for use by StdSchedulerFactory # to create a Quartz Scheduler Instance, if a different # properties file is not explicitly specified. # #============================================================================ # Configure Main Scheduler Properties #============================================================================ org.quartz.scheduler.instanceName = DefaultQuartzScheduler org.quartz.scheduler.rmi.export = false org.quartz.scheduler.rmi.proxy = false org.quartz.scheduler.wrapJobExecutionInUserTransaction = false #============================================================================ # Configure ThreadPool #============================================================================ org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 10 org.quartz.threadPool.threadPriority = 5 org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true #============================================================================ # Configure JobStore #============================================================================ #org.quartz.scheduler.classLoadHelper.class=org.quartz.simpl.CascadingClassLoadHelper org.quartz.jobStore.misfireThreshold = 60000 org.quartz.jobStore.useProperties = true org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate #havent cluster spring #org.quartz.jobStore.dataSource = myDS org.quartz.jobStore.tablePrefix = qrtz_ org.quartz.jobStore.isClustered = false org.quartz.jobStore.maxMisfiresToHandleAtATime=1 #============================================================== #Non-Managed Configure Datasource if you don't use spring cluster #============================================================== #org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver #org.quartz.dataSource.myDS.URL = jdbc\:mysql\://localhost\:3306/qrtz #org.quartz.dataSource.myDS.user = root #org.quartz.dataSource.myDS.password = root #org.quartz.dataSource.myDS.maxConnections =10
这里要备注的是:org.quartz.jobStore.misfireThreshold = 60000
这个属性是配置当发现触发器过时,允许做就之内的trigger任有效。对于详细了解其中的机制,可以查看数据库的变化,特别是数据库中的QRTZ_FIRED_TRIGGERS表。
对于其状态有ACQUIRED和EXECUTING两个状态进行转化,并因此会影响QRTZ_TRIGGERS的表的数据。(个人猜想:quartz是利用这几个字段来保存断点的)
三、下面是项目的搭建代码:
任务类信息类JobModel
public class JobModel { private String jobName; private String group;//对于job,trigger相互绑定的,采用相同的group private Class<?> jobClass; private Trigger trigger; public JobModel() { super(); } //.....getter,setter }
定义一个无状态的Job(若定义一个有状态的Job,需要继承与StatefulMethodInvokingJob)
public class CommonJob extends MethodInvokingJob{ @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("commonJob executing ..."); JobDataMap dataMap = context.getJobDetail().getJobDataMap(); int value = Integer.parseInt(dataMap.getString("key")); System.out.println("value is " + value); dataMap.put("key", new Integer(++value).toString()); } }
SchedulerManager一共对在scheduler中操作job
public class QrtzManager { private static Scheduler scheduler; static { ApplicationContext context = new ClassPathXmlApplicationContext( "applicationContext-quartz2.xml"); scheduler = (StdScheduler) context.getBean("quartzScheduler"); } public void standBy(){ try { scheduler.standby(); } catch (SchedulerException e) { e.printStackTrace(); } } public void start(){ try { scheduler.start(); } catch (SchedulerException e) { e.printStackTrace(); } } //add a job public void deploy(JobModel model,JobDataMap dataMap){ JobDetail jobDetail = new JobDetail(model.getJobName(),model.getGroup(),model.getJobClass()); jobDetail.setJobDataMap(dataMap); try { scheduler.scheduleJob(jobDetail,model.getTrigger()); } catch (SchedulerException e) { e.printStackTrace(); } } //delete a job public void unDeploy(String jobName,String group){ if (jobName.equals("") || group.equals("")) { return ; } try { scheduler.deleteJob(jobName, group); } catch (SchedulerException e) { e.printStackTrace(); } } }
测试类
package com.lps.schedulerserver.service02; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.junit.Test; import org.quartz.CronTrigger; import org.quartz.JobDataMap; import org.quartz.SimpleTrigger; import org.quartz.Trigger; public class Main { public static void main(String[] args) { Trigger trigger = new SimpleTrigger("trigger02", "group02", new Date(), parse("2012-12-12 18:30:00"), 5, 10000L); JobModel model1 = new JobModel("job01", "group01", CommonJob.class, trigger); String expression = "0/15 * * ? * *"; Trigger trigger2 = null; try { trigger2 = new CronTrigger("trigger01", "group", expression); trigger2.setStartTime(new Date()); } catch (ParseException e) { e.printStackTrace(); } JobModel model2 = new JobModel("job02","group02",StatefulJob.class,trigger2); QrtzManager manager = new QrtzManager(); //jobdatamap JobDataMap dataMap = new JobDataMap(); dataMap.put("key", "1"); manager.deploy(model2, dataMap); System.out.println("deploy model2 at:"+new Date()); } public static Date parse(String str){ DateFormat format = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); Date date = null ; try { date = format.parse(str); } catch (ParseException e) { e.printStackTrace(); } return date; } @Test public void deleteJob(){ QrtzManager manager = new QrtzManager(); manager.unDeploy("job01","group01"); } }
相关推荐
通过以上步骤,我们可以构建一个完整的SSM整合Quartz的系统,实现了定时任务的动态管理,并将所有信息持久化到数据库,提高了系统的可维护性和扩展性。这个系统对于需要定时执行任务的项目来说,提供了极大的便利。
4. **数据持久化**:如果使用数据库存储任务和触发器,Quartz会提供相应的SQL脚本。在【描述】中提到的"sql语句"可能就是这些脚本,用于创建Quartz所需的表结构。通过这种方式,任务的配置可以在多个应用服务器之间...
2. **持久化**:Quartz 提供了调度状态的持久化功能,确保即使系统崩溃,任务调度信息也不会丢失。 3. **组件化**:它包含一系列的侦听器、插件和线程池,允许扩展和定制以满足特定需求。 4. **Job 和 Trigger**:...
Spring整合Quartz是一款高效的任务调度框架,用于在Java应用程序中定时执行特定任务。Quartz本身支持多种持久化策略,包括使用数据库(JDBC)来存储作业和触发器信息,这使得任务调度信息在系统重启后仍能保留。下面...
在Spring Boot应用中整合Quartz定时任务是一种常见的需求,它可以帮助我们执行周期性的后台任务,如数据同步、报表生成等。Spring Boot与Quartz的结合提供了便捷的配置方式,特别是通过YAML(YAML Ain't Markup ...
总之,通过Spring与Quartz的整合,我们可以实现动态的定时任务管理,这在实际业务中非常有用。无论是通过API动态调整,还是利用数据库存储,都能满足不同场景的需求。同时,了解和掌握各个版本间的兼容性以及最佳...
4. **JobDetailBean**:这个bean用于定义Job的具体实现,包括Job类的引用、Job的数据绑定以及是否持久化等属性。 5. **CronTriggerBean**:它用于定义触发Job执行的Cron表达式,这允许我们根据预定义的时间模式(如...
在持久化到数据库的情况下,应设置为`org.quartz.impl.jdbcjobstore.JobStoreTX`或`org.quartz.impl.jdbcjobstore.StdJDBCDelegate`。同时,要指定表前缀,如: ``` org.quartz.jobStore.tablePrefix=QRTZ_ org....
本资源"Spring整合Quartz后的简单定时任务示例"提供了如何将这两者结合使用的实例,旨在帮助开发者实现基于Spring的定时任务功能。 首先,我们要理解Spring对定时任务的支持。Spring框架通过`@Scheduled`注解提供了...
本文将深入探讨如何使用Spring整合Quartz来实现定时器,并提供相关代码示例。 首先,理解Spring框架。Spring是一个开源的Java平台,它提供了全面的企业级应用程序开发解决方案,包括依赖注入(DI)、面向切面编程...
Spring整合Quartz定时发送邮件涉及到的关键技术点有: 1. 使用Apache Commons Email库进行邮件发送。 2. 创建Quartz Job,继承Spring提供的`QuartzJobBean`,并在`executeInternal()`方法中执行实际任务。 3. 在...
在本项目"springboot整合mybatis+quartz实现任务持久化"中,我们将讨论如何将这三个技术有效地集成,以实现高效、可靠的定时任务管理。 首先,Spring Boot的整合通常涉及添加依赖。在`pom.xml`或`build.gradle`文件...
在Spring 4.2.1.RELEASE版本中,整合Quartz的过程主要涉及以下几个步骤: 1. **添加依赖**:首先,你需要在项目的`pom.xml`文件中引入Spring和Quartz的依赖。确保版本号与描述中提到的相符,这通常会确保兼容性。 ...
它的强大之处在于灵活的调度规则设置和强大的持久化能力。 接下来,我们看看标题中的"spring quartz 整合示例"。Spring框架提供了一种方便的方式来管理和配置Quartz。通过Spring的XML配置或注解方式,我们可以轻松...
SSH+quartz实现的可动态...它利用Spring的DI和AOP,Struts的MVC,Hibernate的数据持久化,以及Quartz的灵活调度能力,实现了对定时任务的全面管理和控制。这样的系统对于企业的日常运营和自动化工作流有着重要的价值。
**整合Quartz和SpringBatch** 将Quartz与SpringBatch整合,可以利用Quartz的定时功能触发SpringBatch的任务执行。首先,你需要在Spring配置中声明一个QuartzScheduler,并设置JobStore类型为支持集群的JDBCJobStore...
Spring Quartz 是一个强大的任务调度框架,它允许开发者在Spring应用中轻松地定义和执行定时任务。Quartz 是一个开源的作业调度框架,而Spring通过Spring Quartz模块提供了与Quartz的集成,使得在Java环境中管理定时...
总结来说,Spring整合Quartz涉及到Spring上下文的配置、Quartz的Job和Trigger定义,以及持久化和集群的设置。通过这样的整合,你可以轻松地在Spring应用中管理复杂的定时任务,同时保证任务的可靠性和可扩展性。
2. 配置 Scheduler:在 Spring 配置文件中,设置 Quartz 的 SchedulerFactoryBean,指定数据库存储(如果需要持久化任务信息)和相关的配置属性。 3. 定义 Job 和 Trigger:创建 Quartz 作业类(Job),实现 org....
本文将深入探讨如何在Spring 3中整合Quartz 2来实现灵活、可扩展的定时任务系统。 首先,我们要了解Spring 3与Quartz 2的基本概念。Spring 3是Spring框架的一个版本,它提供了诸如依赖注入、面向切面编程、数据访问...