`
moogle
  • 浏览: 107942 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

疑问:Spring配置Quartz例子出错,请看下.谢谢

    博客分类:
  • Java
阅读更多
研究了一天,在官方论坛也查询了很多,就是锁定不了原因。请各位朋友帮忙看看
spring的配置如下:
    <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
分享到:
评论
15 楼 eyejava 2007-03-08  
dwangel 写道
另外可能是自动装配惹得祸,存在dataSource这个bean就自动用数据库的状态维持了。

dwangel 写道
foxty 写道
因为这个时候你的quartz是jobstore用的HDBCJobStore模式,此时会从数据库查询任务。

你如果只是测试的话,可以在你的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
14 楼 dwangel 2006-12-18  
foxty 写道
因为这个时候你的quartz是jobstore用的HDBCJobStore模式,此时会从数据库查询任务。

你如果只是测试的话,可以在你的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>
13 楼 dwangel 2006-12-18  
按照错误信息显示,你使用的quartz应该是使用数据进行job的状态的维护的,但是在数据库中没有找到相应的table,从而无法正常建立scheduler 。

如果你的不需要错误重启功能,改成用内存维护就好。

另外可能是自动装配惹得祸,存在dataSource这个bean就自动用数据库的状态维持了。
12 楼 foxty 2006-12-18  
因为这个时候你的quartz是jobstore用的HDBCJobStore模式,此时会从数据库查询任务。

你如果只是测试的话,可以在你的classpath下加一个文件quartz.properties,并且加上一句org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 。就会采取内存存储的模式了。
11 楼 抛出异常的爱 2006-12-18  
<?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>

看了你的问题周日自己试着作了一次....

引用
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  

从没出过这种错.....
看来好像是你又以什么方式去调用数据库之后产生的问题
PS:你的EmailJobBean生明方式不对应该以小写开头,并用Bean标签声明...
10 楼 抛出异常的爱 2006-12-14  
init method failed?是否是你的Quartz实现的接口不对?
jobDataAsMap这个接口没看到配?
有没有关系?
9 楼 moogle 2006-12-14  
现在就是我的hibernate和quartz的配置不能并存 ,
这2者之间不会有啥不兼容吧。。。
8 楼 moogle 2006-12-13  
ddandyy 写道
很奇怪
   <bean id="emailJobBean" class="org.springframework.scheduling.quartz.JobDetailBean"> 
    <property name="jobClass" value="EmailJobBean"/> 
   </bean> 

你没定义 id=EmailJobBean   为什么这句不报错呢


赫赫 ,这个地方就是那个jobClass的值 就是一个类的完整名称,
我这个类没有包名,所以直接就是这么写的。
7 楼 moogle 2006-12-13  
<br/>
<strong>binker 写道:</strong><br/>
<div class='quote_div'>
<p>可疑之处: 1你的EmailJobBean有包前缀么? 若有那应该定义成<span> </span><span class='tag'>&lt;</span><span class='tag-name'>property</span><span> </span><span class='attribute'>name</span><span>=</span><span class='attribute-value'>"jobClass"</span><span> </span><span class='attribute'>value</span><span>=</span><span class='attribute-value'>"com.yourpackagename.EmailJobBean"</span><span class='tag'>/&gt;</span><span>  </span></p>
<p>  <span class='tag'>&lt;</span><span class='tag-name'>bean</span><span> </span><span class='attribute'>id</span><span>=</span><span class='attribute-value'>"emailJobBean"</span><span> </span><span class='attribute'>class</span><span>=</span><span class='attribute-value'>"org.springframework.scheduling.quartz.JobDetailBean"</span><span class='tag'>&gt;</span><span>  </span> </p>
<li class=''><span>    </span><span class='tag'>&lt;</span><span class='tag-name'>property</span><span> </span><span class='attribute'>name</span><span>=</span><span class='attribute-value'>"jobClass"</span><span> </span><span class='attribute'>value</span><span>=</span><span class='attribute-value'>"EmailJobBean"</span><span class='tag'>/&gt;</span><span>  </span> </li>
<li class='alt'><span>   </span><span class='tag'><span class='tag-name'>bean</span><span class='tag'>&gt;</span><span>  </span> </span></li>
<li class='alt'><span></span>
<p>启动后就保错 <br/>
</p>
<div class='code_title'>代码</div>
<div class='code_div'>
<div class='dp-highlighter'>
<div class='bar'>
<ol class='dp-j'>
    <li class='alt'><span><span class='number'>14</span><span>:</span><span class='number'>29</span><span>:</span><span class='number'>38</span><span>,</span><span class='number'>11882</span><span> ERROR  [org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:</span><span class='number'>205</span><span>)] Context initialization failed   </span></span> </li>
    <li class=''><span>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-</span><span class='number'>00942</span><span>: table or view does not exist   </span> </li>
</ol>
</div>
</div>
<p> </p>
<p>可疑之处2:你的spring-quartz.xml 文件配置,注意到在错误堆栈的最后一行提示jdbcstore lock exception, table or view does not exist.是否其中配置了数据源信息.你可以尝试把其他所有的配置都注释掉,只保留quartz job bean的定义.然后再调试.</p>
</div></li>
</div>
<p>谢谢先</p>
<p>1.我只是做个测试,本身就没有加包。 如果在配置文件写错这些,eclipse会直接提示类不存在的,强行跑也会ClassNotFound</p>
<p>2.我将hibernate配置的文件去掉。 Quartz可正常跑,去掉quartz,hibernate可以正常加载应用<br/>
  加在一起后就还是出现同样的错误。</p>
<p>下面补spring-hibernate.xml 配置<br/>
----------------------------------------------------------------------</p>
<div class='dp-highlighter'>
<div class='bar'>
<ol class='dp-xml'>
    <li class='alt'><span><span class='tag'>&lt;</span><span class='tag-name'>bean</span><span> </span><span class='attribute'>id</span><span>=</span><span class='attribute-value'>"dataSource"</span><span> </span><span class='attribute'>class</span><span>=</span><span class='attribute-value'>"org.springframework.jndi.JndiObjectFactoryBean"</span><span class='tag'>&gt;</span><span>  </span></span> </li>
    <li class=''><span>    </span><span class='tag'>&lt;</span><span class='tag-name'>property</span><span> </span><span class='attribute'>name</span><span>=</span><span class='attribute-value'>"jndiName"</span><span> </span><span class='attribute'>value</span><span>=</span><span class='attribute-value'>"${jdbc.jndiName}"</span><span> </span><span class='tag'>/&gt;</span><span>  </span> </li>
    <li class='alt'><span><span class='tag'><span class='tag-name'>bean</span><span class='tag'>&gt;</span><span>  </span> </span></span></li>
    <li class=''><span>  </span> </li>
    <li class='alt'><span><span class='tag'>&lt;</span><span class='tag-name'>bean</span><span> </span><span class='attribute'>id</span><span>=</span><span class='attribute-value'>"hibernateTemplate"</span><span> </span><span class='attribute'>class</span><span>=</span><span class='attribute-value'>"org.springframework.orm.hibernate3.HibernateTemplate"</span><span> </span><span class='attribute'>autowire</span><span>=</span><span class='attribute-value'>"byName"</span><span class='tag'>/&gt;</span><span>  </span> </span></li>
    <li class=''><span><span class='tag'>&lt;</span><span class='tag-name'>bean</span><span> </span><span class='attribute'>id</span><span>=</span><span class='attribute-value'>"sessionFactory"</span><span> </span><span class='attribute'>class</span><span>=</span><span class='attribute-value'>"org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span><span class='tag'>&gt;</span><span>  </span> </span></li>
    <li class='alt'><span>    </span><span class='tag'>&lt;</span><span class='tag-name'>property</span><span> </span><span class='attribute'>name</span><span>=</span><span class='attribute-value'>"dataSource"</span><span> </span><span class='attribute'>ref</span><span>=</span><span class='attribute-value'>"dataSource"</span><span> </span><span class='tag'>/&gt;</span><span>  </span> </li>
    <li class=''><span>    </span><span class='tag'>&lt;</span><span class='tag-name'>property</span><span> </span><span class='attribute'>name</span><span>=</span><span class='attribute-value'>"mappingDirectoryLocations"</span><span class='tag'>&gt;</span><span>  </span> </li>
    <li class='alt'><span>        </span><span class='tag'>&lt;</span><span class='tag-name'>list</span><span class='tag'>&gt;</span><span>  </span> </li>
    <li class=''><span>        </span><span class='tag'>&lt;</span><span class='tag-name'>value</span><span class='tag'>&gt;</span><span>classpath:org/moo/pojo/</span><span class='tag'><span class='tag-name'>value</span><span class='tag'>&gt;</span><span>  </span> </span></li>
    <li class='alt'><span>        </span><span class='tag'><span class='tag-name'>list</span><span class='tag'>&gt;</span><span>  </span> </span></li>
    <li class=''><span>    </span><span class='tag'><span class='tag-name'>property</span><span class='tag'>&gt;</span><span>  </span> </span></li>
    <li class='alt'><span>    </span><span class='tag'>&lt;</span><span class='tag-name'>property</span><span> </span><span class='attribute'>name</span><span>=</span><span class='attribute-value'>"hibernateProperties"</span><span class='tag'>&gt;</span><span>  </span> </li>
    <li class=''><span>        </span><span class='tag'>&lt;</span><span class='tag-name'>props</span><span class='tag'>&gt;</span><span>  </span> </li>
    <li class='alt'><span>            </span><span class='tag'>&lt;</span><span class='tag-name'>prop</span><span> </span><span class='attribute'>key</span><span>=</span><span class='attribute-value'>"hibernate.dialect"</span><span class='tag'>&gt;</span><span>${hibernate.dialect}</span><span class='tag'><span class='tag-name'>prop</span><span class='tag'>&gt;</span><span>  </span> </span></li>
    <li class=''><span>            </span><span class='tag'>&lt;</span><span class='tag-name'>prop</span><span> </span><span class='attribute'>key</span><span>=</span><span class='attribute-value'>"hibernate.show_sql"</span><span class='tag'>&gt;</span><span>${hibernate.show_sql}</span><span class='tag'><span class='tag-name'>prop</span><span class='tag'>&gt;</span><span>  </span> </span></li>
    <li class='alt'><span>        </span><span class='tag'><span class='tag-name'>props</span><span class='tag'>&gt;</span><span>  </span> </span></li>
    <li class=''><span>    </span><span class='tag'><span class='tag-name'>property</span><span class='tag'>&gt;</span><span>  </span> </span></li>
    <li class='alt'><span><span class='tag'><span class='tag-name'>bean</span><span class='tag'>&gt;</span><span>  </span> </span></span></li>
    <li class=''><span> //下面都是类似的dao,service比较多就不一一列出来了   </span> </li>
    <li class='alt'><span> </span><span class='tag'>&lt;</span><span class='tag-name'>bean</span><span> </span><span class='attribute'>id</span><span>=</span><span class='attribute-value'>"codeService"</span><span> </span><span class='attribute'>class</span><span>=</span><span class='attribute-value'>"org.moo.service.CodeService"</span><span> </span><span class='attribute'>autowire</span><span>=</span><span class='attribute-value'>"byName"</span><span class='tag'>/&gt;</span><span>  </span> </li>
    <li class=''><span> </span><span class='tag'>&lt;</span><span class='tag-name'>bean</span><span> </span><span class='attribute'>id</span><span>=</span><span class='attribute-value'>"codeDao"</span><span> </span><span class='attribute'>class</span><span>=</span><span class='attribute-value'>"org.moo.dao.CodeDao"</span><span> </span><span class='attribute'>autowire</span><span>=</span><span class='attribute-value'>"byName"</span><span class='tag'>/&gt;</span><span>  </span> </li>
</ol>
</div>
<p><br/>
另我看日志输入在出现错误前有:</p>
<div class='dp-highlighter'>
<ol class='dp-xml'>
    <li class='alt'><span><span>15:43:50,23182 INFO   [org.quartz.core.QuartzScheduler.(QuartzScheduler.java:209)] Quartz Scheduler v.null.null.null created.   </span></span> </li>
    <li class=''><span>15:43:50,23241 INFO   [org.quartz.impl.jdbcjobstore.JobStoreSupport.initialize(JobStoreSupport.java:542)] Using db table-based data access locking (synchronization).   </span> </li>
    <li class='alt'><span>15:43:50,23390 DEBUG  [org.quartz.impl.jdbcjobstore.DBSemaphore.obtainLock(DBSemaphore.java:106)] Lock 'TRIGGER_ACCESS' is desired by: main   </span> </li>
    <li class=''><span>15:43:50,24023 DEBUG  [org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:88)] Lock 'TRIGGER_ACCESS' is being obtained: main   </span> </li>
    <li class='alt'><span>15:43:51,24291 DEBUG  [org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:107)] Lock 'TRIGGER_ACCESS' was not obtained by: main   </span> </li>
    <li class=''><span>15:43:51,24332 DEBUG  [org.quartz.utils.ExceptionHelper.supportsNestedThrowable(ExceptionHelper.java:97)] Detected JDK support for nested exceptions.   </span> </li>
    <li class='alt'><span>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   </span> </li>
    <li class=''><span>15:43:51,24438 INFO   [org.springframework.orm.hibernate3.AbstractSessionFactoryBean.destroy(AbstractSessionFactoryBean.java:185)] Closing Hibernate SessionFactory  </span> </li>
</ol>
</div>
<p><br/>
然后才出现了最先提到的错误</p></div>
6 楼 ddandyy 2006-12-13  
很奇怪
   <bean id="emailJobBean" class="org.springframework.scheduling.quartz.JobDetailBean"> 
    <property name="jobClass" value="EmailJobBean"/> 
   </bean> 

你没定义 id=EmailJobBean   为什么这句不报错呢
5 楼 moogle 2006-12-13  
...
我只给出了和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就是一楼的那些内容
4 楼 binker 2006-12-13  
<p>可疑之处: 1你的EmailJobBean有包前缀么? 若有那应该定义成<span> </span><span class='tag'>&lt;</span><span class='tag-name'>property</span><span> </span><span class='attribute'>name</span><span>=</span><span class='attribute-value'>"jobClass"</span><span> </span><span class='attribute'>value</span><span>=</span><span class='attribute-value'>"com.yourpackagename.EmailJobBean"</span><span class='tag'>/&gt;</span><span>  </span></p>
<p>  <span class='tag'>&lt;</span><span class='tag-name'>bean</span><span> </span><span class='attribute'>id</span><span>=</span><span class='attribute-value'>"emailJobBean"</span><span> </span><span class='attribute'>class</span><span>=</span><span class='attribute-value'>"org.springframework.scheduling.quartz.JobDetailBean"</span><span class='tag'>&gt;</span><span>  </span> </p>
<li class=''><span>    </span><span class='tag'>&lt;</span><span class='tag-name'>property</span><span> </span><span class='attribute'>name</span><span>=</span><span class='attribute-value'>"jobClass"</span><span> </span><span class='attribute'>value</span><span>=</span><span class='attribute-value'>"EmailJobBean"</span><span class='tag'>/&gt;</span><span>  </span></li>
<li class='alt'><span>   </span><span class='tag'>&lt;/</span><span class='tag-name'>bean</span><span class='tag'>&gt;</span><span>  </span></li>
<li class='alt'><span></span></li>
<p>启动后就保错 <br/>
</p>
<div class='code_title'>代码</div>
<div class='code_div'>
<div class='dp-highlighter'>
<div class='bar'>
<ol class='dp-j'>
    <li class='alt'><span><span class='number'>14</span><span>:</span><span class='number'>29</span><span>:</span><span class='number'>38</span><span>,</span><span class='number'>11882</span><span> ERROR  [org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:</span><span class='number'>205</span><span>)] Context initialization failed   </span></span></li>
    <li class=''><span>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-</span><span class='number'>00942</span><span>: table or view does not exist   </span></li>
</ol>
</div>
</div>
<p> </p>
<p>可疑之处2:你的spring-quartz.xml 文件配置,注意到在错误堆栈的最后一行提示jdbcstore lock exception, table or view does not exist.是否其中配置了数据源信息.你可以尝试把其他所有的配置都注释掉,只保留quartz job bean的定义.然后再调试.</p></div>
3 楼 ddandyy 2006-12-13  
那就是配置文件有问题

你给出来的不全吧
2 楼 moogle 2006-12-13  
引用
public class EmailJobBean implements StatefulJob


测试后,错误依旧。
@-@.

PS:感谢回帖。
1 楼 ddandyy 2006-12-13  
public class EmailJobBean implements StatefulJob

你试试

相关推荐

Global site tag (gtag.js) - Google Analytics