web-dev-qa-db-fra.com

Erreur Spring 3 + Quartz 2

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 {
        *****
    }

}
23
user705414

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.

18
stevevls

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)

45
Fuping

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 .

18
Martin

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”

16
vijay