2011-11-23 52 views
22

我在Quartz 2中使用Spring 3時收到下面的錯誤。有沒有人知道原因?Spring 3 + Quartz 2錯誤

錯誤:

Exception in thread "main" org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [org.springframework.scheduling.quartz.JobDetailBean] for bean with name 'job' defined in class path resource [beans.xml]: problem with class file or dependent class; nested exception is java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.JobDetailBean has interface org.quartz.JobDetail as super class 
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1253) 

Spring配置文件:

<bean name="job" class="org.springframework.scheduling.quartz.JobDetailBean"> 
    <property name="jobClass" value="Example.ExampleJob"/> 
    <property name="jobDataAsMap"> 
    <map> 
     <entry key="timeout" value="5"/> 
    </map> 
    </property> 
</bean> 

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 
    <property name="jobDetail" ref="job"/> 
    <property name="startDelay" value="1000"/> 
    <property name="repeatInterval" value="5000"/> 
</bean> 

public class ExampleJob extends QuartzJobBean { 

     private int timeout; 

     /** 
     * Setter called after the ExampleJob is instantiated 
     * with the value from the JobDetailBean (5) 
     */ 
     public void setTimeout(int timeout) { 
     this.timeout = timeout; 
     } 

    @Override 
    protected void executeInternal(JobExecutionContext ctx) 
      throws JobExecutionException { 
     ***** 
    } 

} 
+0

請讓主題有意義 – Dariusz

回答

18

上次我檢查,春天不具備石英2.任何支持看看,看看最近的春季構建已經添加了支持,或者嘗試降級到Quartz 1.8.x.

+4

你說得對。在3.1中添加了Quartz 2支持。檢查http://static.springsource.org/spring/docs/3.1.0.RC1/changelog.txt – Adi

+0

很高興知道...謝謝! – stevevls

+1

爲什麼你要折磨我這麼春天?我發誓我會比使用Spring's並且遇到像這樣令人愉快的無證問題更有效率地製作我自己的實現。 –

43

如果你使用Spring 3.1,

與SimpleTriggerFactoryBean

更換SimpleTriggerBean

在3.1版本中,春天已經創建工廠類crontrigger和simpletrigger

更新:

Using Spring 3.2.2, must be useful to change also JobDetailBean => JobDetailFactoryBean and CronTriggerBean => CronTriggerFactoryBean.

感謝Osy(對以下評論投票)

+0

不適用於我。Quartz 2.2.1和Spring 3.2.4 –

+16

使用Spring 3.2.2,對於更改JobDetailBean => JobDetailFactoryBean和CronTriggerBean => CronTriggerFactoryBean也必須有用 – Osy

+1

Osy投票(我已投票贊成他的評論,但我錯誤地撤消了投票,現在我不能「再次投票」)附註:在JobDetailFactoryBean中將持久性設置爲true,如果您看到「添加了不帶觸發器的作業必須持久」錯誤 – jbbarquero

17

根據3.1.0.RC1 Change Log,Spring 3.1支持Quartz 2.x.

{Type}TriggerBean現在有一個{Type}TriggerBeanFactory它可以用來設置觸發器。在你的情況,這將是SimpleTriggerFactoryBean

摘錄

NOTE: This FactoryBean works against both Quartz 1.x and Quartz 2.0/2.1, in contrast to the older SimpleTriggerBean class.

旁註

您可能還需要添加org.springframework.transaction依賴,這取決於哪種類型的觸發器的你使用:

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-tx</artifactId> 
    <version>3.1.2.RELEASE</version> 
</dependency> 

我們需要它r使用CronTriggerFactoryBean觸發器遷移到Quartz 2。

14

如果您使用的春天3.X &石英2.1.x的...

然後做只有兩個在配置文件中 月1日修改:對於簡單觸發

使用class=」org.springframework.scheduling.quartz.SimpleTriggerFactoryBean」>,而不是 class=」org.springframework.scheduling.quartz.SimpleTriggerBean」>

2nd:for Cron Trigger use class=」org.springframework.scheduling.quartz.CronTriggerFactoryBean」 instead of class=」org.springframework.scheduling.quartz.CronTriggerBean」