2011-11-23 19 views
22

Ho ricevuto l'errore qui sotto quando uso Spring 3 con Quartz 2. Qualcuno conosce il motivo?Spring 3 + Quartz 2 error

Errore:

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) 

Primavera file di configurazione:

<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

Si prega di rendere gli argomenti significativi – Dariusz

risposta

18

scorso ho controllato, Primavera non ha il supporto per Quartz 2. Ciascuna dare un'occhiata per vedere se il più recente Primavera costruisce aggiunto il supporto o prova a eseguire il downgrade a Quartz 1.8.x.

+4

Hai ragione. Il supporto al quarzo 2 è stato aggiunto in 3.1. Controlla http://static.springsource.org/spring/docs/3.1.0.RC1/changelog.txt – Adi

+0

buono a sapersi ... grazie! – stevevls

+1

Perché devi tormentarmi così Spring? Giuro che sarei altrettanto produttivo a fare la mia stessa implementazione che usare Spring's e correre su deliziosi problemi privi di documenti come questi. –

43

Se si utilizza Primavera 3.1,

Sostituire il SimpleTriggerBean con SimpleTriggerFactoryBean

Nella versione 3.1, Primavera ha creato classi factory per crontrigger e simpletrigger

Aggiornamento:

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

Ringraziamento a Osy (vota il commento qui sotto)

+0

fa Quartz 2.2.1 e Spring 3.2.4 –

+16

Utilizzando Spring 3.2.2, deve essere utile modificare anche JobDetailBean => JobDetailFactoryBean e CronTriggerBean => CronTriggerFactoryBean. – Osy

+1

Un voto per Osy (Ho votato per il suo commento , ma ho annullato il voto per errore e ora non riesco più a "sovvertire") Nota a margine: In JobDetailFactoryBean imposta la durabilità su true se viene visualizzato l'errore "Lavori aggiunti senza trigger devono essere durevoli" – jbbarquero

17

Secondo lo 3.1.0.RC1 Change Log, Spring 3.1 supporta Quartz 2.x.

Per ogni {Type}TriggerBean v'è ora un {Type}TriggerBeanFactory che può essere utilizzato per i trigger di impostazione. Nel tuo caso questo sarebbe SimpleTriggerFactoryBean

Estratto

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

Sidenote

Potrebbe anche essere necessario aggiungere la dipendenza org.springframework.transaction, a seconda del tipo di trigger si è utilizzando:

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

Ne avevamo bisogno per r migrazione a Quartz 2 in una configurazione utilizzando i trigger CronTriggerFactoryBean.

14

Se si utilizza Primavera 3.x & quarzo 2.1.x ...

Poi lo fanno solo due modifiche nel file di configurazione prima: per semplice trigger

Uso class=”org.springframework.scheduling.quartz.SimpleTriggerFactoryBean”> invece di class=”org.springframework.scheduling.quartz.SimpleTriggerBean”>

2a: per Cron Trigger utilizzare class=”org.springframework.scheduling.quartz.CronTriggerFactoryBean” anziché class=”org.springframework.scheduling.quartz.CronTriggerBean”

Problemi correlati