疑问:Spring配置Quartz例子出错,请看下.谢谢
关键字: Spring Quartzspring的配置如下:
<bean id="emailJobBean" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="EmailJobBean"/>
</bean>
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="emailJobBean" />
<property name="startDelay" value="2000" />
<property name="repeatInterval" value="60000" />
</bean>
<bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger"/>
</list>
</property>
</bean>
其中被调度的bean
public class EmailJobBean extends QuartzJobBean {
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
System.out.println("Quartz !!!");
}
}
启动后就保错
14:29:38,11882 ERROR [org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:205)] Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'quartzScheduler' defined in ServletContext resource [/WEB-INF/classes/spring-quartz.xml]: Invocation of init method failed; nested exception is org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: ORA-00942: table or view does not exist
不知道有没有朋友遇到过类似问题?请大家指点
环境我用的是resin2.1.16,jdk1.4.2,spring2.0.1,quartz1.6.0
评论
你如果只是测试的话,可以在你的classpath下加一个文件quartz.properties,并且加上一句org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 。就会采取内存存储的模式了。
或者可以直接在spring配置中做:
<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>
autowire真是一个万恶的家伙, 这个问题整了我一个下午,怒了.
设置org.quartz.jobStore.class为org.quartz.simpl.RAMJobStore也是没有用的.
因为
if (this.dataSource != null) {
mergedProps.put(StdSchedulerFactory.PROP_JOB_STORE_CLASS, LocalDataSourceJobStore.class.getName());
}
SchedulerFactoryBean的setDataSource(DataSource)方法javadoc说:
Set the default DataSource to be used by the Scheduler. If set, this will override corresponding settings in Quartz properties.
Note: If this is set, the Quartz settings should not define a job store "dataSource" to avoid meaningless double configuration.
A Spring-specific subclass of Quartz' JobStoreCMT will be used. It is therefore strongly recommended to perform all operations on the Scheduler within Spring-managed (or plain JTA) transactions. Else, database locking will not properly work and might even break (e.g. if trying to obtain a lock on Oracle without a transaction).
Supports both transactional and non-transactional DataSource access. With a non-XA DataSource and local Spring transactions, a single DataSource argument is sufficient. In case of an XA DataSource and global JTA transactions, SchedulerFactoryBean's "nonTransactionalDataSource" property should be set, passing in a non-XA DataSource that will not participate in global transactions.
See Also:
setNonTransactionalDataSource
setQuartzProperties
setTransactionManager
LocalDataSourceJobStore
你如果只是测试的话,可以在你的classpath下加一个文件quartz.properties,并且加上一句org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 。就会采取内存存储的模式了。
或者可以直接在spring配置中做:
<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>
如果你的不需要错误重启功能,改成用内存维护就好。
另外可能是自动装配惹得祸,存在dataSource这个bean就自动用数据库的状态维持了。
你如果只是测试的话,可以在你的classpath下加一个文件quartz.properties,并且加上一句org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 。就会采取内存存储的模式了。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!--起动Bean--> <bean id="z" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronReportTrigger"/> </list> </property> </bean> <!--实际的工作Bean--> <bean id="courseService" class="com.spring.helloworld.CourseService"></bean> <!--jobBean用于设定启动时运用的Bean与方法--> <bean id="scheduledReportJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="courseService"/> </property> <property name="targetMethod"> <value>sendCourseEnrollmentReport</value> </property> </bean> <!--定时器设定起动频率&启动时间我设的是每5秒起动一次 (0 0 0 4 * * ?每日四点起动....)--> <bean id="cronReportTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"><ref bean="scheduledReportJobDetail"/> </property> <property name="cronExpression"><value>10,15,20,25,30,35,40,45,50,55 * * * * ?</value> </property> </bean> </beans>
看了你的问题周日自己试着作了一次....
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'quartzScheduler' defined in ServletContext resource [/WEB-INF/classes/spring-quartz.xml]: Invocation of init method failed; nested exception is org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: ORA-00942: table or view does not exist
从没出过这种错.....
看来好像是你又以什么方式去调用数据库之后产生的问题
PS:你的EmailJobBean生明方式不对应该以小写开头,并用Bean标签声明...
jobDataAsMap这个接口没看到配?
有没有关系?
这2者之间不会有啥不兼容吧。。。
<bean id="emailJobBean" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="EmailJobBean"/>
</bean>
你没定义 id=EmailJobBean 为什么这句不报错呢
赫赫 ,这个地方就是那个jobClass的值 就是一个类的完整名称,
我这个类没有包名,所以直接就是这么写的。
binker 写道:
可疑之处: 1你的EmailJobBean有包前缀么? 若有那应该定义成 <property name="jobClass" value="com.yourpackagename.EmailJobBean"/>
[code]<bean id="emailJobBean" class="org.springframework.scheduling.quartz.JobDetailBean">
启动后就保错
- 14:29:38,11882 ERROR [org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:205)] Context initialization failed
- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'quartzScheduler' defined in ServletContext resource [/WEB-INF/classes/spring-quartz.xml]: Invocation of init method failed; nested exception is org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: ORA-00942: table or view does not exist
可疑之处2:你的spring-quartz.xml 文件配置,注意到在错误堆栈的最后一行提示jdbcstore lock exception, table or view does not exist.是否其中配置了数据源信息.你可以尝试把其他所有的配置都注释掉,只保留quartz job bean的定义.然后再调试.
谢谢先
1.我只是做个测试,本身就没有加包。 如果在配置文件写错这些,eclipse会直接提示类不存在的,强行跑也会ClassNotFound
2.我将hibernate配置的文件去掉。 Quartz可正常跑,去掉quartz,hibernate可以正常加载应用
加在一起后就还是出现同样的错误。
下面补spring-hibernate.xml 配置
----------------------------------------------------------------------
- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
- <property name="jndiName" value="${jdbc.jndiName}" />
- bean>
- <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate" autowire="byName"/>
- <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="mappingDirectoryLocations">
- <list>
- <value>classpath:org/moo/pojo/value>
- list>
- property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">${hibernate.dialect}prop>
- <prop key="hibernate.show_sql">${hibernate.show_sql}prop>
- props>
- property>
- bean>
- //下面都是类似的dao,service比较多就不一一列出来了
- <bean id="codeService" class="org.moo.service.CodeService" autowire="byName"/>
- <bean id="codeDao" class="org.moo.dao.CodeDao" autowire="byName"/>
另我看日志输入在出现错误前有:
- 15:43:50,23182 INFO [org.quartz.core.QuartzScheduler.(QuartzScheduler.java:209)] Quartz Scheduler v.null.null.null created.
- 15:43:50,23241 INFO [org.quartz.impl.jdbcjobstore.JobStoreSupport.initialize(JobStoreSupport.java:542)] Using db table-based data access locking (synchronization).
- 15:43:50,23390 DEBUG [org.quartz.impl.jdbcjobstore.DBSemaphore.obtainLock(DBSemaphore.java:106)] Lock 'TRIGGER_ACCESS' is desired by: main
- 15:43:50,24023 DEBUG [org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:88)] Lock 'TRIGGER_ACCESS' is being obtained: main
- 15:43:51,24291 DEBUG [org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:107)] Lock 'TRIGGER_ACCESS' was not obtained by: main
- 15:43:51,24332 DEBUG [org.quartz.utils.ExceptionHelper.supportsNestedThrowable(ExceptionHelper.java:97)] Detected JDK support for nested exceptions.
- 15:43:51,24427 INFO [org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:272)] Destroying singletons in {org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans
- 15:43:51,24438 INFO [org.springframework.orm.hibernate3.AbstractSessionFactoryBean.destroy(AbstractSessionFactoryBean.java:185)] Closing Hibernate SessionFactory
然后才出现了最先提到的错误
<bean id="emailJobBean" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="EmailJobBean"/>
</bean>
你没定义 id=EmailJobBean 为什么这句不报错呢
我只给出了和quartz相关的,其他的就还有一个hibernate的配置
然后就没有了。
去掉quartz的都很正常的跑。这个quartz跑得和hibernate一点关系都没有
总共分了3个配置
spring.xml
----------------------
<beans default-autowire="byName"> <!-- 加载全局配置文件 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:/mail.properties</value> <value>classpath:/jdbc.properties</value> <value>classpath:/hibernate.properties</value> </list> </property> </bean> </beans>
spring-hibernate.xml就是配置了数据源和dao,service
spring-quartz.xml就是一楼的那些内容
可疑之处: 1你的EmailJobBean有包前缀么? 若有那应该定义成 <property name="jobClass" value="com.yourpackagename.EmailJobBean"/>
[code]<bean id="emailJobBean" class="org.springframework.scheduling.quartz.JobDetailBean">
启动后就保错
- 14:29:38,11882 ERROR [org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:205)] Context initialization failed
- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'quartzScheduler' defined in ServletContext resource [/WEB-INF/classes/spring-quartz.xml]: Invocation of init method failed; nested exception is org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: ORA-00942: table or view does not exist
可疑之处2:你的spring-quartz.xml 文件配置,注意到在错误堆栈的最后一行提示jdbcstore lock exception, table or view does not exist.是否其中配置了数据源信息.你可以尝试把其他所有的配置都注释掉,只保留quartz job bean的定义.然后再调试.
你给出来的不全吧
测试后,错误依旧。
@-@.
PS:感谢回帖。
你试试
- 浏览: 33741 次
- 性别:


- 详细资料
搜索本博客
我的相册
共 14 张
最新评论
-
PTViewer 全景显示
请问全景显示到底是怎么回事呢? 是不是先用软件做好全景图,然后插入网页中显示;我 ...
-- by wayer -
[转]UrlRewrite Filter
请问 为什么 我的 项目加了 urlrewrite 好像是没有这个标签 ...
-- by wangjian3q -
配置Spring 支持 Web ses ...
<context-param> <param-nam ...
-- by MrLee23 -
配置Spring 支持 Web ses ...
给你代码整理下,你的看的有点别扭` <context-param> ...
-- by MrLee23 -
使用xStream进行java obj ...
Thanks. JJYAO. I have replied you severa ...
-- by david3d






评论排行榜