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

spring整合quartz并持久化

 
阅读更多

 

spring整合quartz有两种方式:

一.常见是使用配置文件,将定时任务保存到内存中

简单示例:

        

<!-- 短信催还提醒任务调度 -->
	<bean id="overdueRecall"
		class="com.sursen.souba.ddlibserve.quartz.OverdueRecallTimerTask" />


<!--定义定时执行overdueRecallTimerTask 这个bean中的overdueRecall()方法-->
	<bean id="overdueRecallTask"
		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject">
			<ref bean="overdueRecall" />
		</property>
		<property name="targetMethod">
			<value>overdueRecall</value>
		</property>
	</bean>


	<!--触发器的bean的设置,要触发的jobDetail是overdueRecallTask-->
	<bean id="overdueRecallTrigger"
		class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail">
			<ref bean="overdueRecallTask" />
		</property>
		<property name="cronExpression">
			<!-- 每天17:00运行 -->
			<value>0 0 17 * * ?</value>
			<!--<value>0 05 18 * * ?</value>-->
		</property>
	</bean>



	<!--管理触发器的总设置,管理我们的触发器列表,可以在bean的list中放置多个触发器。-->
	<bean autowire="no"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
			   <ref local="overdueRecallTrigger" />
			</list>
		</property>
	</bean>



 这中方式配置简单,但是存在问题

1.定时任务信息都报错在内存中,服务器重启会丢失信息

2.每个定时任务都是一串配置,定时任务多了不好管理

3.任务时间修改后要重新发布项目

 

二.quartz持久化(quartz1.6,最新版本的quartz稍有变动)

 

研究了一下quartz的相关文档,quartz本身就提供将任务和触发器持久化到数据库中的功能

详见<Quartz-Job-Scheduling-Framework>一书

要实现很简单:

 1.安装 Quartz 数据库表
Quartz 包括了所有被支持的数据库平台的 SQL 脚本。你能在 <quartz_home>/docs/dbTables 目录下找到那些 SQL 脚本,这里的 <quartz_home> 是解压 Quartz 分发包后的目录。
2.配置 JobStoreTX

要告诉 Quartz 运行环境你想使用一个别的 JobStore 而不是默认的 RAMJobStore,你必须配置几个属性。配置它们的顺序无关紧要,只要保证在第一次运行程序之前都做了设置。

在你的classpath下加入一个配置文件quartz.properties参数如下:

 

表 6.3. 可用于设置 JobStoreTX 的配置属性
属性 默认值
org.quartz.jobStore.driverDelegateClass  
描述:能理解不同数据库系统中某一特定方言的驱动代理
org.quartz.jobStore.dataSource  
描述:用于 quartz.properties 中数据源的名称
org.quartz.jobStore.tablePrefix QRTZ_
描述:指定用于 Scheduler 的一套数据库表名的前缀。假如有不同的前缀,Scheduler 就能在同一数据库中使用不同的表。
org.quartz.jobStore.userProperties False
描述:"use properties" 标记指示着持久性 JobStore 所有在 JobDataMap 中的值都是字符串,因此能以 名-值 对的形式存储,而不用让更复杂的对象以序列化的形式存入 BLOB 列中。这样会更方便,因为让你避免了发生于序列化你的非字符串的类到 BLOB 时的有关类版本的问题。
org.quartz.jobStore.misfireThreshold 60000
描述:在 Trigger 被认为是错过触发之前,Scheduler 还容许 Trigger 通过它的下次触发时间的毫秒数(译者注:据原文翻译,真的不好理解,实际效果可参看:http://www.blogjava.net/Unmi/archive/2007/10/23/153413.html 我在评论中的实验)。默认值(假如你未在配置中存在这一属性条目) 是 60000(60 秒)。这个不仅限于 JDBC-JobStore;它也可作为 RAMJobStore 的参数
org.quartz.jobStore.isClustered False
描述:设置为 true 打开集群特性。如果你有多个 Quartz 实例在用同一套数据库时,这个属性就必须设置为 true。
org.quartz.jobStore.clusterCheckinInterval 15000
描述:设置一个频度(毫秒),用于实例报告给集群中的其他实例。这会影响到侦测失败实例的敏捷度。它只用于设置了 isClustered 为 true 的时候。
org.quartz.jobStore.maxMisfiresToHandleAtATime 20
描述:这是 JobStore 能处理的错过触发的 Trigger 的最大数量。处理太多(超过两打) 很快会导致数据库表被锁定够长的时间,这样就妨碍了触发别的(还未错过触发) trigger 执行的性能。
org.quartz.jobStore.dontSetAutoCommitFalse False
描述:设置这个参数为 true 会告诉 Quartz 从数据源获取的连接后不要调用它的 setAutoCommit(false) 方法。这在少些情况下是有帮助的,比如假如你有这样一个驱动,它会抱怨本来就是关闭的又来调用这个方法。这个属性默认值是 false,因为大多数的驱动都要求调用 setAutoCommit(false)
org.quartz.jobStore.selectWithLockSQL SELECT * FROM {0}LOCKS WHERE LOCK_NAME = ? FOR UPDATE
描述:这必须是一个从 LOCKS 表查询一行并对这行记录加锁的 SQL 语句。假如未设置,默认值就是 SELECT * FROM {0}LOCKS WHERE LOCK_NAME = ? FOR UPDATE,这能在大部分数据库上工作。{0} 会在运行期间被前面你配置的 TABLE_PREFIX 所替换。
org.quartz.jobStore.txIsolationLevelSerializable False
描述:值为 true 时告知 Quartz(当使用 JobStoreTX 或 CMT) 调用 JDBC 连接的 setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE) 方法。这有助于阻止某些数据库在高负载和长时间事物时锁的超时。

示例,使用的是sqlserver数据库:

 

#org.quartz.scheduler.instanceName = Mscheduler  
org.quartz.scheduler.instanceId = AUTO  
  
#============================================================================  
# Configure ThreadPool    
#============================================================================  
  
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  
org.quartz.threadPool.threadCount = 3  
org.quartz.threadPool.threadPriority = 5  
  
#============================================================================  
# Configure JobStore    
#============================================================================  
  
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore  
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX  
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.MSSQLDelegate  
org.quartz.jobStore.useProperties = true  
org.quartz.jobStore.dataSource = myDS  
org.quartz.jobStore.tablePrefix = QRTZ_  
org.quartz.jobStore.isClustered = false  
org.quartz.jobStore.maxMisfiresToHandleAtATime=1  
#============================================================================  
# Configure Datasources    
#============================================================================  
  
org.quartz.dataSource.myDS.driver =  net.sourceforge.jtds.jdbc.Driver 
org.quartz.dataSource.myDS.URL =  jdbc\:jtds\:sqlserver\://ip/dbk 
org.quartz.dataSource.myDS.user = db2  
org.quartz.dataSource.myDS.password = db2  
org.quartz.dataSource.myDS.maxConnections = 5    
  
#============================================================================  
# Configure Plugins   
#============================================================================  
  
#org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin  
  
#org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin  
#org.quartz.plugin.jobInitializer.fileNames = jobs.xml  
#org.quartz.plugin.jobInitializer.overWriteExistingJobs = true  
#org.quartz.plugin.jobInitializer.failOnFileNotFound = true  
#org.quartz.plugin.jobInitializer.scanInterval = 10  
#org.quartz.plugin.jobInitializer.wrapInUserTransaction = false  

然后可直接运行以下测试类:

package com.sursen.test.service;

import java.text.ParseException;

import org.apache.commons.lang.StringUtils;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;


public class QuartzTest  {
		private static SchedulerFactory sf = new StdSchedulerFactory(); 
		private static String JOB_GROUP_NAME = "ddlib";
		private static String TRIGGER_GROUP_NAME = "ddlibTrigger";
	
	
	  /**添加一个定时任务,使用默认的任务组名,触发器名,触发器组名*/
	   public static void addJob(String jobName,Job job,String cronExpression)
	                               throws SchedulerException, ParseException{
		   addJob(jobName,null,jobName,null,job,cronExpression);
	   }
	  
	   /** 
	    * 添加一个定时任务
	    * @param jobName 任务名
	    * @param jobGroupName 任务组名
	    * @param triggerName 触发器名
	    * @param triggerGroupName 触发器组名
	    * @param job     任务
	    * @param cronExpression    时间设置,参考quartz说明文档
	    */
	   public static void addJob(String jobName,String jobGroupName,
	                             String triggerName,String triggerGroupName,Job job,String cronExpression)
	                               throws SchedulerException, ParseException{
		   if(StringUtils.isBlank(jobGroupName)){
			   jobGroupName = JOB_GROUP_NAME;
		   }
		   if(StringUtils.isBlank(triggerGroupName)){
			   triggerGroupName = TRIGGER_GROUP_NAME;
		   }
		   Scheduler sched = sf.getScheduler();
	       JobDetail jobDetail = new JobDetail(jobName, jobGroupName, job.getClass());//任务名,任务组,任务执行类
	       CronTrigger  trigger = new CronTrigger(jobName,triggerGroupName,cronExpression);//触发器名,触发器组,cron表达式
	       sched.scheduleJob(jobDetail,trigger);
	       //启动
	       if(!sched.isShutdown()){
	    	   sched.start();
	       }
	   }
	  
	   /** 
	    * 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
	    */
	   public static void modifyJobTime(String jobName,String cronExpression)
	                                  throws SchedulerException, ParseException{
		   modifyJobTime(jobName, null, cronExpression);
	   }
	  
	   /**
	    * 修改一个任务的触发时间
	    */
	   public static void modifyJobTime(String triggerName,String triggerGroupName,
	                                    String cronExpression)throws SchedulerException, ParseException{
		   if(StringUtils.isBlank(triggerGroupName)){
			   triggerGroupName = TRIGGER_GROUP_NAME;
		   }
	       Scheduler sched = sf.getScheduler();
	       Trigger trigger = sched.getTrigger(triggerName,triggerGroupName);
	       if(trigger != null){
	           CronTrigger ct = (CronTrigger)trigger;
	           //修改时间
	           ct.setCronExpression(cronExpression);
	           //重启触发器
	           sched.resumeTrigger(triggerName,triggerGroupName);
	       }
	   }
	  
	   /**移除一个任务和触发器(使用默认的任务组名,触发器名,触发器组名)*/
	   public static void removeJob(String jobName,String triggerName)
	                               throws SchedulerException{
		   removeJob(jobName, null, triggerName, null);
	   }
	  
	   /**移除一个任务和触发器 */
	   public static void removeJob(String jobName,String jobGroupName,
	                                String triggerName,String triggerGroupName)
	                               throws SchedulerException{
		   if(StringUtils.isBlank(jobGroupName)){
			   jobGroupName = JOB_GROUP_NAME;
		   }
		   if(StringUtils.isBlank(triggerGroupName)){
			   triggerGroupName = TRIGGER_GROUP_NAME;
		   }
	       Scheduler sched = sf.getScheduler();
	       sched.pauseTrigger(triggerName,triggerGroupName);//停止触发器
	       sched.unscheduleJob(triggerName,triggerGroupName);//移除触发器
	       sched.deleteJob(jobName,jobGroupName);//删除任务
	   }
	
	
	
	public static void main(String[] args) throws SchedulerException, ParseException {
//		addJob("test", new TestJob(), "*/5 * * * * ?");
//		addJob("zht", new TestJob(), "*/10 * * * * ?");
//		removeJob("myJob","myJobGroup", "myTrigger","myTriggerGroup");
		removeJob("test","test");
		removeJob("zht","zht");
		
	}
} 

 

三.spring下quartz的持久化

在spring配置文件中加入以下代码

	<!-- quartz持久化存储  -->
	 <bean id="scheduler"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >  
     <!--   <property name="dataSource">  
            <ref bean="ddlibserveDataSource" />  
        </property>   -->
       <!--  <property name="schedulerName" value="Mscheduler" />   -->
        <property name="configLocation" value="classpath:quartz.properties" />
        <property name="applicationContextSchedulerContextKey"  
            value="applicationContextKey" />  
        <property name="autoStartup" value="true" />  
    </bean>  
      
      
 

 

之后将

<bean id="scheduler"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >  

注入到所需要的service中即可.

 

其中

 <!--   <property name="dataSource">  
            <ref bean="ddlibserveDataSource" />  
        </property>   -->

 为注入的数据源,

如果使用这种方式那配置文件中的相关配置要注释掉.

 

或者将配置文件中信息写入到spring配置文件中:

	<!-- quartz持久化存储  -->
	 <bean id="scheduler"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >  
     	<property name="dataSource">  
            <ref bean="ddlibserveDataSource" />  
        </property>
        
         <!--方式一 : quartz.properties配置文件是放在classpath下 
        <property name="configLocation" value="classpath:quartz.properties" /> -->
        
         <!--方式二 : quartz.properties配置文件是放在WEB-INF下 
        <property name="configLocation" value="/WEB-INF/quartz.properties" /> -->
        
         <!--方式三 : quartz.properties配置文件写入到配置XML中 -->
        <property name="quartzProperties">  
            <props>  
                <prop key="org.quartz.scheduler.instanceName">quartzScheduler</prop>  
                <prop key="org.quartz.scheduler.instanceId">AUTO</prop>  
                <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>  
                <prop key="org.quartz.threadPool.threadCount">3</prop>  
                <prop key="org.quartz.threadPool.threadPriority">5</prop>  
                <prop key="org.quartz.jobStore.misfireThreshold">60000</prop>  
                <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>  
                <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.MSSQLDelegate </prop>  
                <prop key="org.quartz.jobStore.selectWithLockSQL">SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?</prop>  
                <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>  
                <prop key="org.quartz.jobStore.isClustered">true</prop>  
                <prop key="org.quartz.jobStore.clusterCheckinInterval">20000</prop>  
            </props>  
        </property>
        <property name="applicationContextSchedulerContextKey"  value="applicationContextKey" />  
        <property name="autoStartup" value="true" />    
    </bean>  

 

 

 

期间遇到的问题留作记录:

1.持久化时遇到报字段不正确或表不存在的问题

原因: 我使用的是quartz 2.1建的表而jar包是1.6的

解决方法: 将建表语句和jar包统一版本即可

 

2.报dataSource name不存在的问题

原因: quartz.properties中的 org.quartz.jobStore.dataSource = myDS 

忘记打开或者与数据源配置没有保持一致

解决方法: 打开保持一致即可

 

3.使用注入dataSource时报

Failure obtaining db row lock: 第 1 行: FOR UPDATE 子句仅允许用于 DECLARE CU...

改为数据源写在quartz.properties中解决

还不清楚为什么注入不行(解决)

 

org.quartz.jobStore.selectWithLockSQL SELECT * FROM {0}LOCKS WHERE LOCK_NAME = ? FOR UPDATE
描述:这必须是一个从 LOCKS 表查询一行并对这行记录加锁的 SQL 语句。假如未设置,默认值就是 SELECT * FROM {0}LOCKS WHERE LOCK_NAME = ? FOR UPDATE,这能在大部分数据库上工作。{0} 会在运行期间被前面你配置的 TABLE_PREFIX 所替换。

 

 这条sql在sqlserver2000中不能运行修改为:

org.quartz.jobStore.selectWithLockSQL=SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ? 

 问题解决

 

4. <property name="configLocation" value="classpath:quartz.properties" />

 

这种方式配置quartz.properties文件需要放在classpath下,而我们项目中都是放在Web-info下

可直接修改为:

 

<property name="configLocation" value="/WEB-INF/quartz.properties" />

 

5.在spring配置文件中

 

<bean id="quartzServiceImpl"  
        class="com.sursen.test.service.impl.QuartzServiceImpl">  
        <property name="scheduler">  
            <ref bean="scheduler" />  
        </property>  
    </bean>    
 以这种方式将scheduler即StdScheduler  scheduler注入到相关service中报找不到该property的错误
而service中是肯定存在的 : private StdScheduler  scheduler;
改为spring的注解形式注入
@Autowired
private StdScheduler  scheduler; 
 
也不行,再改为
@Resource
private StdScheduler  scheduler; 
 或者
@Qualifier("scheduler")
private StdScheduler  scheduler; 
 
则没有问题,具体原因还在查找
 
 
 

 

 

 

分享到:
评论
8 楼 doujinxain 2015-08-21  
有源码可以下载吗?不胜感激!
7 楼 xiaojie921 2015-06-13  
为什么,我配置好后,数据库表没任何数据呢?job_detail这个也是空的,只有在schedule_state里面有个状态。。。不解啊,也没报错
6 楼 dujunjun 2015-02-05  
很受益,正在找相关资料,现在可以借鉴一下了,多谢楼主分享
5 楼 夕夕尧 2015-02-04  
楼主,我的怎么一直报错,
[ERROR]2015-02-04 13:48:49,152 message:(Context initialization failed)
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scheduler' defined in class path resource [applicationContext.xml]: Cannot resolve reference to bean 'ddlibserveDataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'ddlibserveDataSource' is defined
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1325)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:563)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4973)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'ddlibserveDataSource' is defined
4 楼 yuhao0201 2014-04-04  
楼主,解决了,是我spring数据源配置出错的,已经改好了。
3 楼 yuhao0201 2014-04-04  
楼主,你好!
 
   新手按照你的例子在java项目上是没有问题的,但是我在web上用的时候,测试报:
  
Exception in thread "main" org.quartz.SchedulerConfigException: DataSource name not set.
at org.quartz.impl.jdbcjobstore.JobStoreSupport.initialize(JobStoreSupport.java:566)
at org.quartz.impl.jdbcjobstore.JobStoreTX.initialize(JobStoreTX.java:56)
at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1230)
at org.quartz.impl.StdSchedulerFactory.getScheduler(StdSchedulerFactory.java:1393)
at com.jr.example.test.QuartzTest.addJob(QuartzTest.java:77)
at com.jr.example.test.QuartzTest.addJob(QuartzTest.java:49)
at com.jr.example.test.QuartzTest.main(QuartzTest.java:175)

异常,应该是StdScheduler  scheduler注入问题。可我在试了你上面的三种注入方式测试还是报这个异常。
2 楼 qtm315475 2013-12-19  
很好,很详细啊。
1 楼 lvite3mc 2013-11-28  
写的很详细很有参考价值赞一个

相关推荐

    springboot2.3集成quartz定时任务持久化数据库,支持集群

    在本文中,我们将深入探讨如何在Spring Boot 2.3版本中集成Quartz定时任务,并实现其持久化到数据库,以便支持集群环境。这个过程的关键在于配置Quartz Scheduler,设置数据库连接,以及确保任务在多节点环境中能够...

    Quartz2.0持久化到数据库

    在“Quartz2.0持久化到数据库”这个主题中,我们将深入探讨如何将Quartz2.0的任务调度信息存储到数据库中,以便在系统重启或故障后能够恢复任务,并提供更可靠的调度服务。 首先,理解Quartz2.0的持久化机制至关...

    spring整合quartz文档

    2. **持久化**:Quartz 提供了调度状态的持久化功能,确保即使系统崩溃,任务调度信息也不会丢失。 3. **组件化**:它包含一系列的侦听器、插件和线程池,允许扩展和定制以满足特定需求。 4. **Job 和 Trigger**:...

    spring集成quartz集群配置

    本文将深入探讨如何在Spring环境中集成Quartz以实现集群配置,以便于在分布式环境中进行高效的任务调度。 首先,理解Spring集成Quartz的核心在于Spring的Job接口和Quartz的Scheduler。Spring提供了`org.spring...

    Java_Spring与Quartz的整合

    - 使用Spring注解:可选地,可以使用Spring的`@DisallowConcurrentExecution`和`@PersistJobDataAfterExecution`注解来控制Job的行为,以及数据的持久化。 2. **创建Job类** - Job类需要实现`org.quartz.Job`接口...

    Quartz持久化资料大全

    综上,Quartz持久化是保证定时任务不因系统重启而丢失的关键技术,它与Spring的集成使得配置更为灵活,而Quartz版本间的兼容性则保证了项目的平滑升级。在实际开发中,理解并掌握这些知识点对于充分利用Quartz的功能...

    spring+quartz使用jar包

    1. **Spring与Quartz的整合**:Spring 提供了对Quartz的集成支持,通过`org.springframework.scheduling.quartz`包中的类,如`SchedulerFactoryBean`和`ThreadPoolTaskExecutor`,可以轻松地将Quartz纳入Spring的...

    spring整合quartz使用jdbc存储

    Spring整合Quartz是一款高效的任务调度框架,用于在Java应用程序中定时执行特定任务。Quartz本身支持多种持久化策略,包括使用数据库(JDBC)来存储作业和触发器信息,这使得任务调度信息在系统重启后仍能保留。下面...

    springboot整合quartz定时任务yml文件配置方式

    在Spring Boot应用中整合Quartz定时任务是一种常见的需求,它可以帮助我们执行周期性的后台任务,如数据同步、报表生成等。Spring Boot与Quartz的结合提供了便捷的配置方式,特别是通过YAML(YAML Ain't Markup ...

    quartz和spring-quartz

    4. **JobStore**: Spring-Quartz支持不同的Job存储方式,如RAMJobStore(内存存储)、JDBCJobStore(数据库存储),这决定了Job和Trigger的状态如何持久化。 5. **异常处理**: Spring-Quartz可以通过Spring的异常...

    Quartz2.2.1存储与持久化-基于Spring的配置

    在这个基于Spring的配置中,我们将深入探讨如何在Spring应用中集成Quartz,实现任务的存储和持久化。 首先,我们需要在Spring配置文件中引入Quartz的相关bean。这通常包括`SchedulerFactoryBean`,它是Spring管理...

    quartz界面化持久化管理

    2. **Quartz持久化**: - Quartz支持多种持久化机制,如JDBC JobStore、RAMJobStore等。JDBC JobStore将任务和触发器信息保存在数据库中,确保系统重启后任务不会丢失。 3. **自定义Job类**: - 开发者需要继承`...

    Spring整合Quartz

    Spring整合Quartz是一个常见的任务调度解决方案,用于在Java应用程序中执行定时任务。Quartz是一个功能强大的、开放源代码的作业调度框架,而Spring框架则是一个全面的企业级应用开发框架。将两者结合,我们可以利用...

    spring的quartz定时任务相关(持久化任务)

    本文介绍了如何在Spring框架中集成Quartz定时任务,并重点讨论了任务状态的持久化管理。通过将Quartz与Spring结合使用,不仅能够实现对任务的精确调度,还可以有效地管理和监控任务的执行情况,这对于构建稳定可靠的...

    Spring+quartz相关jar包.rar

    2. 配置 Scheduler:在 Spring 配置文件中,设置 Quartz 的 SchedulerFactoryBean,指定数据库存储(如果需要持久化任务信息)和相关的配置属性。 3. 定义 Job 和 Trigger:创建 Quartz 作业类(Job),实现 org....

    SpringQuartz的使用文档

    Quartz是开源的,具有高度灵活的调度功能,能够根据预定义的时间表触发任务,同时具备调度状态的持久化能力,即使在系统故障后也能恢复调度。 Spring对Quartz进行了集成,使其更易于在Spring应用程序中使用。Spring...

    spring-quartz定时设置详细说明

    Quartz 可以与任何持久化机制集成,包括 JDBC 数据库存储任务信息。 二、Spring 集成 Quartz 1. 添加依赖:在 Maven 或 Gradle 项目中,需要引入 Spring 对 Quartz 的支持。添加相应的依赖库,例如: Maven: ``...

    SSM整合quartzb并持久化到数据库实现动态增删改查

    下面将详细介绍如何将这三个组件与Quartz整合,并将定时任务的配置和状态持久化到数据库,实现动态的增删改查功能。 1. **Spring配置** 在Spring的配置文件中,我们需要引入Quartz的相关依赖。首先,定义一个`...

    Spring+Quartz example

    同时,Quartz还支持任务的持久化,即使应用重启,未完成的任务也能继续执行。 在实际开发中,Spring+Quartz的组合常常用于实现后台的定时任务,比如数据同步、报表生成、邮件发送等。通过这种方式,开发者可以把...

    quartz整合springbatch动态集群定时实现mysql参考

    MySQL被用作Quartz的JobStore和Spring Batch的持久化存储,存储作业状态、调度信息以及批处理作业的相关数据。 项目中的关键组成部分可能包括: 1. **Quartz配置**:定义了调度器、作业和触发器的配置,可能使用了`...

Global site tag (gtag.js) - Google Analytics