2014-01-10 65 views
2

調用事務的問題,我設置石英2.1.0在WebSphere在集羣模式下運行,使用JobStoreTX,我能org.quartz.scheduler.jmx.export這樣我就可以通過JMX訪問石英調度。與集羣石英通過JMX

問題是,當我要調用通過JMX一些方法,做一些與SQL我得到異常:

java.lang.Exception: Failure obtaining db row lock: Not in transaction. 
    at org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:116) 
    at org.quartz.impl.jdbcjobstore.DBSemaphore.obtainLock(DBSemaphore.java:115) 
    at org.quartz.impl.jdbcjobstore.JobStoreCMT.executeInLock(JobStoreCMT.java:238) 
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.removeTrigger(JobStoreSupport.java:1410) 
    at org.quartz.core.QuartzScheduler.unscheduleJob(QuartzScheduler.java:1026) 
    at org.quartz.core.QuartzScheduler.deleteJob(QuartzScheduler.java:934) 
    at org.quartz.core.QuartzSchedulerMBeanImpl.deleteJob(QuartzSchedulerMBeanImpl.java:352) 

看來,調度中的所有操作都需要被封閉成一個事務,但是當調用通過JMX不存在事務。我應該如何解決它?

<property name="quartzProperties"> 
      <props> 
       <prop key="org.quartz.scheduler.instanceName">myApp</prop> 
       <prop key="org.quartz.scheduler.instanceId">AUTO</prop> 
       <prop key="org.quartz.jobStore.misfireThreshold">60000</prop> 
       <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop> 
       <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop> 
       <prop key="org.quartz.jobStore.tablePrefix">q</prop> 
       <prop key="org.quartz.jobStore.isClustered">true</prop> 
       <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop> 
       <prop key="org.quartz.threadPool.threadCount">5</prop> 
       <prop key="org.quartz.threadPool.threadPriority">5</prop> 
       <prop key="org.quartz.scheduler.skipUpdateCheck">true</prop> 
       <prop key="org.quartz.scheduler.jmx.export">true</prop> 
       <prop key="org.quartz.scheduler.jmx.objectName">quartz:type=QuartzScheduler,name=JmxScheduler</prop> 
      </props> 
     </property> 

UPDATE:

我使用的彈簧,JobStoreTX被overrided到LocalDataSourceJobStore

UPDATE2

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /> 
<jee:jndi-lookup id="dataSourceCron" jndi-name="jdbc/..." /> 



<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="applicationContextSchedulerContextKey" value="applicationContext" /> 
    <property name="dataSource" ref="dataSourceCron" /> 
    <property name="transactionManager" ref="transactionManager" /> 
    <property name="overwriteExistingJobs" value="true" /> 
    <property name="autoStartup" value="true" /> 
    <property name="triggers" ref="jobTriggers" /> 
    <property name="jobDetails" ref="jobDetails" /> 
(properties) 

</bean> 
+0

你可以發表你的Spring配置的其他人呢? –

+0

您可以發佈代碼/配置,瞭解如何將Spring與JMX集成,您如何在JMX –

+0

中發佈Spring Bean,它已經在這裏。我只是將屬性jmx.export添加到true,然後公開MBean。你有什麼意思與春天融合?我正在使用SchedulerFactoryBean,這是我的春天上下文 – hudi

回答

0

Spring的事務管理器處於工作通過開展範圍活躍應用程序,但是當通過JMX對同一作業進行分類時,它不會處於活動狀態。

你是如何註冊工作,通過JMX是啓動的,你可以張貼代碼?

最好的方法是使用JMX Spring集成工具,其中Spring bean可以通過JMX註冊,請參閱文檔here。有一個如何在JMX中發佈Spring bean的例子。

+0

數據源中的彈簧類是OK。當作業在應用程序內部運行時,一切正常。就在我想通過JMX調用某個操作時,就會出現這個問題。是的,我正在使用Spring – hudi

0

由於Quartz Scheduler是一個託管的spring bean,因此您可以使用spring的declarative transaction management來使Scheduler「知道事務」。

使得QuartzSchedulerMBeanImpl「交易意識到」可能是一個更簡潔的方法,但是這是一個有點棘手,因爲它不是一個管理的Spring bean。 (它創建了here)。通過註冊&暴露自己的MBean你可以使用Spring的聲明式事務管理,使其「事務感知」。另一種方法是使用AspectJ來使mbean「知道交易」。