Spring 3 + Quartz 2错误

use*_*414 23 java spring quartz-scheduler

当我使用Quartz 2的Spring 3时,我收到了以下错误.有谁知道原因?

错误:

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)
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

Fup*_*ing 45

如果你使用Spring 3.1,

用SimpleTriggerFactoryBean替换SimpleTriggerBean

在3.1版本中,Spring为crontrigger和simpletrigger创建了Factory类

更新:

使用Spring 3.2.2,还必须更改JobDetailBean => JobDetailFactoryBean和CronTriggerBean => CronTriggerFactoryBean.

感谢Osy(对以下评论投票)

  • 使用Spring 3.2.2,还必须更改JobDetailBean => JobDetailFactoryBean和CronTriggerBean => CronTriggerFactoryBean. (16认同)

ste*_*vls 18

最后我查了一下,Spring没有对Quartz 2的支持.要么看看最近的Spring版本是否添加了所述支持,或者尝试降级到Quartz 1.8.x.

  • 你是对的.3.1中添加了Quartz 2支持.请查看http://static.springsource.org/spring/docs/3.1.0.RC1/changelog.txt (4认同)
  • 我使用的是Spring 3.2.4,类"org.springframework.scheduling.quartz.SchedulerFactoryBean"中的Javadoc说"兼容Quartz 1.5+以及Quartz 2.0-2.2,从Spring 3.2开始".但我仍然得到这个错误.有没有人能够使用Quartz 2.2.x运行Spring 3.2.x? (3认同)

Mar*_*tin 18

根据3.1.0.RC1更改日志,Spring 3.1支持Quartz 2.x.

{Type}TriggerBean现在每个人{Type}TriggerBeanFactory都可以使用它来设置触发器.在你的情况下,这将是SimpleTriggerFactoryBean

摘抄

注意:与旧的SimpleTriggerBean类相比,此FactoryBean对Quartz 1.x和Quartz 2.0/2.1都有效.

边注

您可能还需要添加org.springframework.transaction依赖项,具体取决于您使用的触发器类型:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>3.1.2.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我们需要它在使用CronTriggerFactoryBean触发器的配置中迁移到Quartz 2 .


小智 16

如果您使用的是Spring 3.x和Quartz 2.1.x ......

然后在您的配置文件1st中仅进行两次更改:对于简单触发器

class=”org.springframework.scheduling.quartz.SimpleTriggerFactoryBean”>而不是 class=”org.springframework.scheduling.quartz.SimpleTriggerBean”>

第二:使用Cron Trigger class=”org.springframework.scheduling.quartz.CronTriggerFactoryBean”代替 class=”org.springframework.scheduling.quartz.CronTriggerBean”