java - ejemplo - spring quartz annotation example
Spring 3+Quartz 2 error (4)
Recibí el siguiente error cuando uso Spring 3 con Quartz 2. ¿Alguien sabe el motivo?
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)
Archivo de configuración de primavera:
<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 {
*****
}
}
De acuerdo con el static.springsource.org/spring/docs/3.1.0.RC1/changelog.txt , Spring 3.1 tiene soporte para Quartz 2.x.
Para cada {Type}TriggerBean
ahora hay un {Type}TriggerBeanFactory
que se puede usar para configurar disparadores. En su caso, esto sería SimpleTriggerFactoryBean
Extracto
NOTA: Este FactoryBean funciona tanto con Quartz 1.x como con Quartz 2.0 / 2.1, en contraste con la antigua clase SimpleTriggerBean.
Nota al margen
Es posible que también deba agregar la dependencia org.springframework.transaction, dependiendo del tipo de activador que esté utilizando:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
Lo necesitábamos para la migración a Quartz 2 en una configuración que utiliza los activadores CronTriggerFactoryBean
.
La última vez que lo verifiqué, Spring no tiene soporte para Quartz 2. O bien, eche un vistazo para ver si las compilaciones Spring más recientes han agregado dicho soporte, o intente cambiar a Quartz 1.8.x.
Si está utilizando Spring 3.x & Quartz 2.1.x…
Luego haga solo dos cambios EN SU archivo de configuración 1: para Trigger simple
Use class=”org.springframework.scheduling.quartz.SimpleTriggerFactoryBean”>
lugar de class=”org.springframework.scheduling.quartz.SimpleTriggerBean”>
Segundo: para Cron Trigger use class=”org.springframework.scheduling.quartz.CronTriggerFactoryBean”
lugar de class=”org.springframework.scheduling.quartz.CronTriggerBean”
Si usa la primavera 3.1,
Reemplace el SimpleTriggerBean con SimpleTriggerFactoryBean
En la versión 3.1, Spring ha creado las clases de Factory para crontrigger y simpletrigger
Actualizar:
Usar Spring 3.2.2, debe ser útil para cambiar también JobDetailBean => JobDetailFactoryBean y CronTriggerBean => CronTriggerFactoryBean.
Crédito a Osy (vote por el comentario abajo)