2011-11-23 18 views
22

Recibí el siguiente error cuando uso Spring 3 con Quartz 2. ¿Alguien sabe el motivo?Spring 3 + Quartz 2 error

error:

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 fichero de configuración:

<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

Por favor, haz que los temas tengan sentido – Dariusz

Respuesta

18

Que yo sepa, la primavera no tiene soporte para cuarzo 2. Cualquiera de echar un vistazo para ver si la última primavera construye ha agregado dicho soporte, o prueba la degradación a Quartz 1.8.x.

+4

Tienes razón. El soporte Quartz 2 se agrega en 3.1. Compruebe http://static.springsource.org/spring/docs/3.1.0.RC1/changelog.txt – Adi

+0

bueno saber ... ¡gracias! – stevevls

+1

¿Por qué me atormentas así que la primavera? Juro que sería casi tan productivo hacer mi propia implementación que usar Spring's y encontrarme con deliciosos temas no documentados como estos. –

43

Si utiliza Primavera 3.1,

Sustituir el SimpleTriggerBean con SimpleTriggerFactoryBean

En la versión 3.1, la primavera ha creado clases de fábrica de crontrigger y simpletrigger

Actualización:

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

Crédito a Osy (vote sobre el comentario a continuación)

+0

no funciona para mí. Cuarzo 2.2.1 y 3.2.4 primavera –

+16

utilizando Spring 3.2.2, debe ser útil cambiar también JobDetailBean => JobDetailFactoryBean y CronTriggerBean => CronTriggerFactoryBean. – Osy

+1

Un voto por Osy (he votado por su comentario , pero me he deshecho el voto por error, y ahora no puedo "upvote" de nuevo) nota al margen: En JobDetailFactoryBean establece la durabilidad a cierto si usted ve "trabajos agregados sin gatillo debe ser duradero" error – jbbarquero

17

De acuerdo con 3.1.0.RC1 Change Log, Spring 3.1 tiene soporte para Quartz 2.x.

Por cada {Type}TriggerBean ahora hay un {Type}TriggerBeanFactory que se puede usar para configurar desencadenantes. En su caso esto sería SimpleTriggerFactoryBean

Extracto

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

Nota al margen

También podría ser necesario añadir la dependencia org.springframework.transaction, dependiendo de qué tipo de disparo está utilizando:

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

Lo necesitamos para r migración a Quartz 2 en una configuración que utiliza CronTriggerFactoryBean activadores.

14

Si está utilizando 3.x primavera & cuarzo 2.1.x ...

Después, realice sólo dos cambios en su fichero de configuración primero: para el gatillo simple

Uso class=”org.springframework.scheduling.quartz.SimpleTriggerFactoryBean”> en lugar de class=”org.springframework.scheduling.quartz.SimpleTriggerBean”>

2º: para Cron Trigger use class=”org.springframework.scheduling.quartz.CronTriggerFactoryBean” en lugar de class=”org.springframework.scheduling.quartz.CronTriggerBean”