J'ai reçu l'erreur ci-dessous lorsque j'utilise Spring 3 avec Quartz 2. Est-ce que quelqu'un connaît la raison?
Erreur:
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)
Fichier de configuration de printemps:
<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 {
*****
}
}
La dernière fois que j'ai vérifié, Spring ne prend pas en charge Quartz 2. Jetez un œil pour voir si les versions les plus récentes de Spring ont ajouté cette prise en charge, ou essayez de rétrograder vers Quartz 1.8.x.
Si vous utilisez Spring 3.1,
Remplacez SimpleTriggerBean par SimpleTriggerFactoryBean
Dans la version 3.1, Spring a créé des classes Factory pour crontrigger et simpletrigger
Mettre à jour:
L'utilisation de Spring 3.2.2 doit être utile pour modifier également JobDetailBean => JobDetailFactoryBean et CronTriggerBean => CronTriggerFactoryBean.
Crédit à Osy (vote sur le commentaire ci-dessous)
Selon le .1.0.RC1 Change Log , Spring 3.1 prend en charge Quartz 2.x.
Pour chaque {Type}TriggerBean
il y a maintenant un {Type}TriggerBeanFactory
qui peut être utilisé pour configurer des déclencheurs. Dans votre cas, ce serait SimpleTriggerFactoryBean
Extrait
REMARQUE: Ce FactoryBean fonctionne à la fois avec Quartz 1.x et Quartz 2.0/2.1, contrairement à l'ancienne classe SimpleTriggerBean.
Sidenote
Vous devrez peut-être également ajouter la dépendance org.springframework.transaction, selon le type de déclencheur que vous utilisez:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
Nous en avions besoin pour la migration vers Quartz 2 dans une configuration utilisant des déclencheurs CronTriggerFactoryBean
.
Si vous utilisez Spring 3.x et Quartz 2.1.x…
Ensuite, n'effectuez que deux modifications DANS VOTRE fichier de configuration 1er: pour Simple Trigger
Utilisation class=”org.springframework.scheduling.quartz.SimpleTriggerFactoryBean”>
au lieu de class=”org.springframework.scheduling.quartz.SimpleTriggerBean”>
2ème: pour Cron Trigger, utilisez class=”org.springframework.scheduling.quartz.CronTriggerFactoryBean”
au lieu de class=”org.springframework.scheduling.quartz.CronTriggerBean”