Spring 3 + Quartz 2 错误

24

我在使用Spring 3和Quartz 2时收到了以下错误。有人知道原因吗?

错误:

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)

Spring配置文件:

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

}

请确保主题有意义。 - Dariusz
4个回答

45

如果您使用的是Spring 3.1版本,

请将SimpleTriggerBean替换为SimpleTriggerFactoryBean

在3.1版中,Spring创建了工厂类来管理crontrigger和simpletrigger

更新:

在使用Spring 3.2.2时,同样需要将JobDetailBean更改为JobDetailFactoryBean,CronTriggerBean更改为CronTriggerFactoryBean。

感谢Osy(在下方的评论中投票)


16
使用Spring 3.2.2版本,需要将JobDetailBean更改为JobDetailFactoryBean,将CronTriggerBean更改为CronTriggerFactoryBean,这样才能发挥作用。 - Osy
1
Osy得到我的投票了(我本来给他的评论点了赞,但是不小心撤销了,现在我无法再点赞了)。另外提示一下,在JobDetailFactoryBean中将durability设置为true,如果你看到“Jobs added with no trigger must be durable”的错误提示。 - jbbarquero

18

我最后检查时,Spring没有支持Quartz 2。建议你查看最新的Spring版本是否已经添加了该支持,或者尝试降级到Quartz 1.8.x。


4
没问题,你说得对。Quartz 2 的支持在3.1版本中被添加了。请查看http://static.springsource.org/spring/docs/3.1.0.RC1/changelog.txt。 - Adisesha
1
为什么你要这样折磨我,Spring?我发誓,如果使用Spring并遇到这些令人愉快的未记录问题,我自己实现会更有效率。 - Joseph Lust
3
我正在使用Spring 3.2.4,类“org.springframework.scheduling.quartz.SchedulerFactoryBean”的Java文档表示:“从Spring 3.2开始,与Quartz 1.5+以及Quartz 2.0-2.2兼容”。但我仍然遇到了错误。是否有人能够成功地让Spring 3.2.x与Quartz 2.2.x一起运行? - Titi Wangsa Bin Damhore
@Adi这是不是意味着我不能在Spring 2.5 Web应用程序中使用Quartz 2.3.0? - Aakash Patel

18
根据3.1.0.RC1变更日志,Spring 3.1支持Quartz 2.x。
现在,对于每个{Type}TriggerBean,都有一个{Type}TriggerBeanFactory,可用于设置触发器。在您的情况下,这将是SimpleTriggerFactoryBean摘录

注意:此FactoryBean适用于Quartz 1.x和Quartz 2.0 / 2.1,与旧的SimpleTriggerBean类不同。

附注

根据您使用的触发器类型,您可能还需要添加org.springframework.transaction依赖项:

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

我们需要它来迁移到使用CronTriggerFactoryBean触发器的Quartz 2配置。

16
如果您正在使用Spring 3.x和Quartz 2.1.x…
那么只需在配置文件中进行两个更改: 第一步:对于Simple Trigger 请使用“org.springframework.scheduling.quartz.SimpleTriggerFactoryBean”类,而不是“org.springframework.scheduling.quartz.SimpleTriggerBean”。
第二步:对于Cron Trigger 请使用“org.springframework.scheduling.quartz.CronTriggerFactoryBean”类,而不是“org.springframework.scheduling.quartz.CronTriggerBean”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接