spring将Quartz很好的集成在了一起。关于spring中Quartz的用法,网上很多,这里就不在叙述,大家可以查阅相关资料,这里主要描述在开发中遇到的一个问题。
这是我spring的配置文件:
<bean id="LoadDists" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject"><ref bean="DistServiceCommon"/></property>
<property name="targetMethod"><value>getDists</value></property>
</bean>
<bean id="LoadDistsTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail"><ref bean="LoadDists"/></property>
<property name="cronExpression"><value>0 2 08-21 * * ?</value></property>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list><ref local="LoadDistsTrigger"/></list>
</property>
</bean>
但在系统启动时,报以下错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.scheduling.quartz.SchedulerFactoryBean' defined in class path resource [springconfig/applicationContext-loadjob.xml]: Initialization of bean failed; nested exception is org.quartz.SchedulerConfigException: Failure occured during job recovery.
org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: ORA-00942: 表或视图不存在
[See nested exception: java.sql.SQLException: ORA-00942: 表或视图不存在
]]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.initialize(JobStoreSupport.java:504)
at org.quartz.impl.jdbcjobstore.JobStoreCMT.initialize(JobStoreCMT.java:150)
at org.springframework.scheduling.quartz.LocalDataSourceJobStore.initialize(LocalDataSourceJobStore.java:131)
at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:888)
at org.quartz.impl.StdSchedulerFactory.getScheduler(StdSchedulerFactory.java:1020)
at org.springframework.scheduling.quartz.SchedulerFactoryBean.createScheduler(SchedulerFactoryBean.java:599)
at org.springframework.scheduling.quartz.SchedulerFactoryBean.afterPropertiesSet(SchedulerFactoryBean.java:508)
网上有人说,quartz是jobstore用的HDBCJobStore模式,此时会从数据库查询任务。
改为:
<bean name="quartzScheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
</list>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.jobStore.class">
org.quartz.simpl.RAMJobStore
</prop>
</props>
</property>
</bean>
可错误依旧。
我用的是spring+hibernate的框架,单独使用Quartz或hibernate都运行得很好。和在一起就报错。
研究了半天,看了SchedulerFactoryBean的源代码,终于找到了问题。原来问题出在我定义的datasource:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="${jdbc.jndiName}" />
<bean>
SchedulerFactoryBean中的数据源属性名也叫datasource,我将整个系统的数据源名称定义为dataSource后,Quartz就将dataSource注入,同时认为应该从数据库中查询任务。所以出现上面的错误。
将<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="${jdbc.jndiName}" />
<bean>
改为
<bean id="ds1" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="${jdbc.jndiName}" />
<bean>
后,问题解决。
这应该是Quartz的一个小小bug,希望它的新版本能解决这个问题。
此文转载自:东华_励志人生的BLOG
http://blog.sina.com.cn/s/blog_5537a55301000b8b.html
分享到:
相关推荐
Spring 提供了与 Quartz 集成的模块,使得在 Spring 应用程序中使用 Quartz 更加便捷,包括 Job 实例的管理、触发器的配置以及对 Quartz Scheduler 的控制。 在这个 "spring+quartz demo" 中,我们可以学习到如何将...
5. **异常处理**: Spring-Quartz可以通过Spring的异常处理机制来捕获和处理Job执行时抛出的异常。 学习Quartz和Spring-Quartz,不仅需要理解它们的基本概念,还要掌握如何在实际项目中进行配置和使用。例如,创建一...
- 配置Quartz:在Spring的配置文件(如`applicationContext.xml`)中,定义`SchedulerFactoryBean`,配置Quartz的基本参数,如线程池大小、JobStore类型等。 - 注册Job和Trigger:在配置文件中,通过`<bean>`标签...
在Spring配置文件中,我们可以声明这些bean并关联它们,这样Spring就能自动管理和触发Quartz任务。 集群配置的关键在于确保所有节点都能共享相同的任务状态和调度信息。Quartz通过使用数据库存储作业和触发器来实现...
2. **Spring配置文件**:在Spring的XML配置文件中,我们需要声明一个`SchedulerFactoryBean`,它是Spring对Quartz调度器的封装。通过这个bean,我们可以配置Quartz的相关属性,如JobStore类型(内存或数据库存储),...
2. 配置Scheduler:在Spring的配置文件中,使用`SchedulerFactoryBean`来初始化和配置Quartz Scheduler。可以设置如数据库存储、线程池大小等参数。 3. 创建Job类:定义一个实现了`org.quartz.Job`接口的类,这是...
- 创建SchedulerFactoryBean:在Spring配置文件中定义一个`SchedulerFactoryBean`,设置相关属性,如JobStore类型、ThreadPool大小等。 - 注册JobDetail和Trigger:创建`JobDetail`对象表示Job,设置Job类、名字和...
2. 配置Quartz:在Spring的配置文件中,我们需要定义一个`SchedulerFactoryBean`,这是Quartz调度器的Spring Bean,可以设置相关属性,如线程池大小、是否自动启动等。 ```xml <bean id="scheduler" class="org....
3. **整合过程**:整合 Spring 2 和 Quartz 需要在 Spring 配置文件中声明 Job 和 Trigger 的 Bean,并指定它们的关联。Spring 可以通过其自身的 JobFactory 来创建 Job 实例,使得 Job 可以利用 Spring 的 DI 功能...
2. **配置quartz.properties**:这是Quartz的核心配置文件,用于定义调度器的属性,如线程池大小、数据库连接等。例如: ``` org.quartz.scheduler.instanceName=MyScheduler org.quartz.threadPool.threadCount=...
6. **异常处理**:为确保任务的健壮性,可以在Job类中捕获并处理异常,或者在Spring配置中定义JobListener,监听job的执行状态。 通过以上步骤,我们可以灵活地在Spring应用中使用Quartz实现定时任务的启动和停止。...
6. **配置 Scheduler**:创建 `SchedulerFactoryBean`,它是 Spring 提供的用于管理 Quartz Scheduler 的工具类,通过设置 JobDetails 和 Triggers,将它们绑定到 Scheduler 中。 7. **启动 Scheduler**:在应用...
10. **异常处理**:在Spring-Quartz中,如果Job执行过程中发生异常,可以通过`@DisallowConcurrentExecution`或`@PersistJobDataAfterExecution`注解来控制异常处理策略。 理解以上知识点后,你就可以根据提供的...
通常,这样的示例会包含Spring配置文件(如`applicationContext.xml`或`application.yml`)、Java配置类、定时任务类(实现`org.quartz.Job`接口)以及触发器配置(使用`org.quartz.Trigger`)。 总的来说,了解和...
在给定的配置文件`applicationContext-quartz.xml`中,可以看到Spring如何配置Quartz来动态管理任务调度。以下是一些关键点: 1. **Bean配置**: - `sysScheduleService`:这是一个服务类的bean,实现了任务调度的...
在Spring配置文件中,可以使用`SchedulerFactoryBean`来初始化并管理Scheduler。这个bean将负责启动、停止Scheduler,以及处理其他相关的生命周期事件。 在非配置动态定时任务中,我们不再在XML或Java配置中硬编码...
#### 3.2 配置Quartz 在Spring配置文件中,定义SchedulerFactoryBean,设置相关的配置属性,如JobStore类型、DataSource等。 ```xml <bean id="schedulerFactoryBean" class="org.springframework.scheduling....
《Spring任务调度配置详解:Spring+Quartz的整合应用》 在Java开发中,任务调度是不可或缺的一部分,Spring框架提供了与Quartz集成的能力,使得我们可以方便地管理和执行定时任务。本文将详细介绍如何通过Spring和...
1. **Spring集成Quartz**:Spring通过`org.springframework.scheduling.quartz`包提供了与Quartz的集成,可以方便地在Spring应用上下文中配置Job、Trigger以及Scheduler。这包括使用`SchedulerFactoryBean`来启动和...
5. **异常处理**:Spring Quartz允许你定义全局的JobExceptionListener和TriggerListener,以便在Job执行时捕获和处理异常,或者监听触发器的状态变化。 6. **持久化**:Quartz支持多种数据库来持久化Job和Trigger...