2014-02-06 37 views
0

我试图让一个集群,春季管理石英环境会和我正在与交易的问题。他们的交易特点:石英不能使用Spring

2014-02-06 13:59:00,015 ERROR org.quartz.core.ErrorLogger - Error executing Job (DEFAULT.idleDeviceJob: couldn't begin execution. 
org.quartz.SchedulerException: UserTransactionHelper could not lookup/create UserTransaction. [See nested exception: javax.naming.NamingException: Cannot create resource instance] 
    at org.quartz.ee.jta.UserTransactionHelper$UserTransactionWithContext.<init>(UserTransactionHelper.java:148) 
    at org.quartz.ee.jta.UserTransactionHelper.lookupUserTransaction(UserTransactionHelper.java:108) 
    at org.quartz.ee.jta.JTAJobRunShell.begin(JTAJobRunShell.java:101) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:164) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:560) 
Caused by: javax.naming.NamingException: Cannot create resource instance 
    at org.apache.naming.factory.TransactionFactory.getObjectInstance(TransactionFactory.java:116) 
    at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:843) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:154) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:831) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:168) 
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:158) 
    at javax.naming.InitialContext.lookup(InitialContext.java:411) 
    at org.quartz.ee.jta.UserTransactionHelper$UserTransactionWithContext.<init>(UserTransactionHelper.java:145) 
    ... 4 more 

显然是我参与的运行Tomcat,UserTransaction没有JNDI注册。这就是说,我无法弄清楚如何获得石英使用我在我的应用程序上下文通过AOP提供的现有交易(或只是忽略了交易的东西,AOP处理它):

<!-- Quartz Scheduler Transaction Propagation --> 
    <tx:advice id="quartzSchedulerAdvice" transaction-manager="txManager"> 
     <tx:attributes>  
      <tx:method name="get*" read-only="true" propagation="SUPPORTS" /> 
      <tx:method name="set*" read-only="true" propagation="SUPPORTS" /> 
      <tx:method name="is*" read-only="true" propagation="SUPPORTS" /> 
      <tx:method name="insert*" read-only="false" propagation="REQUIRED"/> 
      <tx:method name="update*" read-only="false" propagation="REQUIRED"/> 
      <tx:method name="delete*" read-only="false" propagation="REQUIRED"/> 
      <tx:method name="schedule*" read-only="false" propagation="REQUIRED" rollback-for="org.quartz.SchedulerException"/> 
      <tx:method name="pause*" read-only="false" propagation="REQUIRED"/> 
      <tx:method name="resume*" read-only="false" propagation="REQUIRED"/> 
      <tx:method name="run*" read-only="false" propagation="REQUIRED"/> 
      <tx:method name="update*" read-only="false" propagation="REQUIRED"/> 
      <tx:method name="delete*" read-only="false" propagation="REQUIRED"/> 
      <tx:method name="toggle*" read-only="false" propagation="REQUIRED"/> 
      <tx:method name="clone*" read-only="false" propagation="REQUIRED"/> 
     </tx:attributes> 
    </tx:advice> 

    <!-- ensure that the above transactional advice runs for any execution of 
     an operation defined by the FooService interface --> 
    <aop:config> 
     <aop:pointcut id="jdbcDaoPC" 
      expression="execution(* com.project.repository.*.*(..))" /> 
     <aop:advisor advice-ref="txAdvice" pointcut-ref="jdbcDaoPC" /> 
    </aop:config> 
    <aop:config> 
      <aop:pointcut id="quartzSchedulerPointcut" 
      expression="execution(* org.quartz.Scheduler.*(..))" /> 
     <aop:advisor advice-ref="quartzSchedulerAdvice" 
      pointcut-ref="quartzSchedulerPointcut" /> 
    </aop:config> 

我使用BoneCP作为我的数据源L:

<!-- Row Mapper Beans --> 
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" 
    destroy-method="close"> 
    <property name="driverClass" value="${jdbc.driverClassName}" /> 
    <property name="jdbcUrl" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 
    <property name="idleConnectionTestPeriod" value="60" /> 
    <property name="idleMaxAge" value="240" /> 
    <property name="maxConnectionsPerPartition" value="5" /> 
    <property name="minConnectionsPerPartition" value="2" /> 
    <property name="partitionCount" value="3" /> 
    <property name="acquireIncrement" value="5" /> 
    <property name="statementsCacheSize" value="100" /> 
    <property name="releaseHelperThreads" value="3" /> 
</bean> 

而且我的春节,调度出厂配置是在这里:

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
     <property name="configLocation" value="classpath:quartz.properties"/> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="nonTransactionalDataSource"> 
      <bean class="org.apache.commons.dbcp.BasicDataSource"> 
       <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
       <property name="url" value="${jdbc.url}" /> 
       <property name="username" value="${jdbc.username}" /> 
       <property name="password" value="${jdbc.password}" /> 
      </bean> 
     </property> 
     <property name="transactionManager" ref="txManager"/> 


     <property name="schedulerName" value="ClusteredScheduler"/> 


     <property name="overwriteExistingJobs" value="true"/> 

     <property name="autoStartup" value="true"/> 
     <property name="applicationContextSchedulerContextKey" value="applicationContext"/> 
     <property name="jobFactory"> 
      <bean class="com.project.scheduling.persistence.AutowiringSpringBeanJobFactory"/> 
     </property> 
     <property name="schedulerContextAsMap"> 
      <map> 
       <entry key="dataSource" value-ref="dataSource" /> 
       <entry key="transactionManager" value-ref="txManager" /> 
      </map> 
     </property> 
     <property name="jobDetails"> 
      <list> 
       <ref bean="shipNoticeJob" /> 
       <ref bean="idleDeviceJob" /> 
       <ref bean="distanceJob" /> 
       <ref bean="deviceMaintenanceJob" /> 
      </list> 
     </property> 

     <property name="triggers"> 
      <list> 
       <ref bean="shipNoticeCronTrigger" /> 
       <ref bean="idleDeviceTrigger" /> 
       <ref bean="distanceTrigger" /> 
       <ref bean="deviceMaintenanceTrigger" /> 

      </list> 
     </property> 
    </bean> 

无教程等我已经能够在网上找到参考这个问题在Tomcat的,所以我离开那里有假设配置步骤我失踪...

回答

2

那么,这一个在盯着我的脸:

org.quartz.scheduler.wrapJobExecutionInUserTransaction=true 

本来应该是:

org.quartz.scheduler.wrapJobExecutionInUserTransaction=false 

杜。