1、SchedulerFactoryBean会自动启动。
当在spring文件中定义了多个SchedulerFactoryBean实例时,一定要小心,因为这些ScheduleFactoryBean自从load进程序里,就会自动启动。如果要手动控制,注意要将autoStartup属性设置为false。
2、SchedulerFactoryBean暴露的是Scheduler,而不是SchedulerFactoryBean。
SchedulerFactoryBean实现了FactoryBean接口,必须实现两个方法,一个是getObjectType,另外一个则是getObject;其中getObjectType定义了返回的类型应该为Scheduler,而getObject指定了返回的是其一个重要属性scheduler,这个scheduler就是我们要获得的调度。
若在配置文件里为SchedulerFactoryBean定义了id属性为"scheduler",则在程序里调用getBean时,需要注意getBean("scheduler")返回的是Scheduler对象
3、
SchedulerFactoryBean中有两个很重要的属性,一个是scheduler,另外一个是schedulerFactoryClass,spring通过用schedulerFactoryClass做代理来产生调度,并把它赋给scheduler。
private Class schedulerFactoryClass = StdSchedulerFactory.class;
//如果你没有指定schedulerFactoryClass ,那么它用的是quartz中自带的调度工厂,
this.scheduler = createScheduler(schedulerFactory, this.schedulerName);
//这里的schedulerName默认传进来是空的,其实如果你不是用自己定义的schedulerFactoryClass
//恐怕也没有什么意义,因为createScheduler是这样调用的
return schedulerFactory.getScheduler();
//显然schedulerName并没有用到,除非是你自行写一个schedulerFactory,并做好相应处理,
//否则返回的这个scheduler一定是一个指定名称的调度
Scheduler sched = schedRep.lookup(getSchedulerName());
//这个sched就是要代理生成的scheduler,getSchedulerName只有一句话,如下:
cfg.getStringProperty(PROP_SCHED_INSTANCE_NAME,"QuartzScheduler");
//如果我们没有使用一些特殊的机制,那么返回的只能是一个固定的字符串。
如上说述,如果我们希望不进行改造,就在spring的配置文件中定义多个调度的方法来实现我们个性化的任务安排时,可能并不可行。因为spring配置的scheduler只能有一个,即使你定义了多个调度,那么其实实现的只有一个,只是所有你希望指向不同调度的id都会指向它罢了,而这个调度会包含了其它所有调度中的任务。
4、抱错:org.quartz.SchedulerException: Repeat Interval cannot be zero
场景:该错误通常是在引用了SimpleTriggerBean的时候没有为repeatCount和repeatInterval赋值或者赋值为‘0’长生的配置如下
<bean id="uploadTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="uploadJob"></property>
<property name="repeatCount" value="1"></property>
<property name="repeatInterval" value="1"></property>
</bean>
很奇怪,SimpleTriggerBean有一个空构造函数,在里面直接为repeatCount赋了一个REPEAT_INDEFINITELY,这样,当其进入validate函数时,会抱错。而quartz中的SimpleTrigger这两个属性默认值均为0,不懂spring中为何这样处理。如果为“1”的话会运行两次。
<bean id="uploadTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="uploadJob"></property>
<property name="repeatCount" value="1"></property>
<property name="repeatInterval" value="1"></property>
</bean>
很奇怪,SimpleTriggerBean有一个空构造函数,在里面直接为repeatCount赋了一个REPEAT_INDEFINITELY,这样,当其进入validate函数时,会抱错。而quartz中的SimpleTrigger这两个属性默认值均为0,不懂spring中为何这样处理。如果为“1”的话会运行两次。
5、quartz和crontab的区别
a、quartz属于用户级别,crontab则属于系统级别;
b、quartz调度的线程,所有线程共享一个jvm;crontab调度的则是应用,每个应用都独立的占用资源。
6、quartz中加入并发多线程分析
a、quartz本身是有线程池支持的,这个可以用org.quartz.threadPool.threadCount属性来设置线程池大小,quartz的任务可以由quartz的线程池自动调度
b、对每个任务也可能起多线程,但是需要对并发数量做控制,可以考虑使用commons-pools提供的对象池机制
7、在发布的web工程的时候最好要把quartz里的基础包一起打包,要不回找不到一些类,基础包在quartz-1.6.0/lib下
如果出现java.lang.NoClassDefFoundError: javax/transaction/UserTransaction. 那说明jta.jar没有导入classpath路径
8、quartz中加入监听器
quartz的监听器有两种,全局监听器和非全局监听器
--全局监听器即监听全部的trigger或jobdetail的事件
scheduler.addGlobalJobListener(myJobListener);
--非全局的顾名思义监听某个trigger或jobdetail的事件
scheduler.addJobListener(myJobListener);
并且还要在我们要见的jobDetail类或trigger类中调用
spring中的配置如下
scheduler类
<bean id="scheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="getMessageFormEduHallTrigger"/>
</list>
</property>
<property name="triggerListeners">
<list>
<ref local="systemUploadTaskListener"/>
</list>
</property>
</bean>
trigger类
<bean id="getMessageFormEduHallTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="getMessageFormEduHallJob"></property>
<property name="cronExpression" value="1 * * * * ?"></property>
<property name="triggerListenerNames">
<list>
<value>SystemUploadTaskListener</value>
</list>
</property>
</bean>
7、在发布的web工程的时候最好要把quartz里的基础包一起打包,要不回找不到一些类,基础包在quartz-1.6.0/lib下
如果出现java.lang.NoClassDefFoundError: javax/transaction/UserTransaction. 那说明jta.jar没有导入classpath路径
8、quartz中加入监听器
quartz的监听器有两种,全局监听器和非全局监听器
--全局监听器即监听全部的trigger或jobdetail的事件
scheduler.addGlobalJobListener(myJobListener);
--非全局的顾名思义监听某个trigger或jobdetail的事件
scheduler.addJobListener(myJobListener);
并且还要在我们要见的jobDetail类或trigger类中调用
addJobListener()或addTriggerListener(),其中的输入参数和listener类的getName()的返回的字符串要一直,并且要唯一spring中的配置如下
scheduler类
<bean id="scheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="getMessageFormEduHallTrigger"/>
</list>
</property>
<property name="triggerListeners">
<list>
<ref local="systemUploadTaskListener"/>
</list>
</property>
</bean>
trigger类
<bean id="getMessageFormEduHallTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="getMessageFormEduHallJob"></property>
<property name="cronExpression" value="1 * * * * ?"></property>
<property name="triggerListenerNames">
<list>
<value>SystemUploadTaskListener</value>
</list>
</property>
</bean>
相关推荐
Spring 中的 Quartz 配置-Spring 定时器-java 定时器 在 Spring 框架中,Quartz 是一个非常流行的开源作业调度器,可以实现任务的定时执行。在本篇文章中,我们将讨论如何在 Spring 中配置 Quartz,以实现 Java ...
整合 Spring 和 Quartz 的过程中,需要注意以下几点: - **事务管理**:当 Job 需要在事务环境中执行时,需要确保 Spring 事务管理与 Quartz 的集成正确。 - **错误处理**:合理处理 Job 执行异常,避免影响整个 ...
**Spring Quartz时间调用框架详解** Spring Quartz是一个在Spring框架中集成的时间调度插件,它允许开发者方便地创建和管理定时任务。Quartz是Java领域的一款功能强大的作业调度库,而Spring通过其优秀的IoC...
### Spring中Quartz的配置详解 #### 一、前言 Spring框架因其强大的功能和灵活性在企业级应用开发中占据了一席之地。其中,对于定时任务的支持,Spring结合了Quartz这一优秀的开源任务调度框架,提供了更为灵活和...
在Quartz中实现动态集群,主要是通过共享JobStore实现的,例如使用SQLJobStore,这样所有节点都可以访问同一个作业存储,从而确保任务的一致性和避免冲突。 在这个项目中,结合Quartz和Spring Batch,开发者可能...
首先,要在Spring中使用Quartz,你需要将`quartz-all-1.5.2.jar`等相关的Quartz库添加到项目的类路径中。这个库包含了Quartz所需的所有组件,使你可以方便地创建和管理定时任务。 在配置文件中,我们通常会创建一个...
在上述配置中,`jobExecutionService`是自定义的Job执行类,它需要实现`org.quartz.Job`接口或者使用Spring的`MethodInvokingJobDetailFactoryBean`来调用特定方法。`CronTriggerFactoryBean`用于设置触发器的执行...
要在Spring 3中使用Quartz,首先需要在项目中添加Quartz库的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml <groupId>org.quartz-scheduler <artifactId>quartz <version>2.3.2 ``` ...
Spring整合Quartz是一款常见的任务调度解决方案,它允许开发者在应用程序中安排定时任务的执行。Quartz是一个开源的作业调度框架,而Spring通过提供一个简洁的API使得与Quartz的集成变得简单。以下是对Spring整合...
Spring 和 Quartz2 是两个在 Java 开发中广泛使用的框架,它们在企业级应用中承担着重要的角色。Spring 是一个全面的、开源的应用框架,而 Quartz2 是一个强大的、开源的作业调度库,常用于实现定时任务。下面我们将...
在Spring框架中集成Quartz库可以实现强大的定时任务管理功能。Quartz是一个开源的作业调度框架,它允许程序创建和管理任务,以便在特定时间自动执行。Spring通过其优秀的依赖注入(DI)和AOP(面向切面编程)特性,...
Spring框架作为Java领域广泛使用的轻量级框架,提供了与第三方库Quartz的整合,使得开发者能够轻松地在Spring应用中实现复杂的定时任务调度。Quartz是一款开源的作业调度框架,支持丰富的调度策略,可以满足各种定时...
集群模式在Quartz中称为“集群(Clustering)”,目的是为了提高系统的可用性和可靠性。Quartz集群通过共享内存中的状态来实现任务的分配和执行,当一个节点失败时,其他节点能够接管未完成的任务。实现Quartz集群,...
总的来说,Spring集成Quartz提供了灵活的定时任务解决方案,但同时需要注意避免配置错误和并发问题,以防止任务被执行多次。通过理解Quartz的工作原理和Spring的定时任务API,我们可以有效地管理定时任务,确保它们...
Spring Quartz 是一个集成Quartz定时任务框架与Spring的开源项目,它使得在Spring应用中配置和管理定时任务变得更加便捷。Quartz是Java平台上的一个强大、完全可移植的作业调度库,可以用来创建复杂的调度任务,而...
在IT行业中,Spring框架和Quartz是两个广泛用于任务调度的重要工具。Spring提供了一种集成Quartz的方式,使得我们可以方便地在Spring应用中管理和执行定时任务。本篇将深入探讨如何在Spring中启动和停止Quartz定时器...
在Spring框架中集成Quartz调度器,可以实现定时任务的高效管理。Quartz是一个开源的作业调度框架,它允许程序创建、调度和执行任务。在本示例中,我们将探讨如何在Spring应用中配置和使用Quartz,以及通过示例代码来...
- `schedulerJobDetail`:Spring的`MethodInvokingJobDetailFactoryBean`用于定义一个任务,它将在`sysScheduleService`中调用`reScheduleJob`方法。 - `cronTrigger`:使用`CronTriggerBean`定义了一个基于CRON...
在Quartz中,任务由`Job`接口表示。你需要创建一个实现`org.quartz.Job`接口的类,并覆盖`execute(JobExecutionContext context)`方法。例如: ```java @Component public class MyJob implements Job { @...
Spring整合Quartz是一款高效的任务调度框架,用于在Java应用程序中定时执行特定任务。Quartz本身支持多种持久化策略,包括使用数据库(JDBC)来存储作业和触发器信息,这使得任务调度信息在系统重启后仍能保留。下面...