当我使用带有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)
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 {
*****
}
}
答案 0 :(得分:44)
如果您使用Spring 3.1,
将SimpleTriggerBean替换为SimpleTriggerFactoryBean
在3.1版本中,Spring为crontrigger和simpletrigger
创建了Factory类更新
使用Spring 3.2.2,也必须更改JobDetailBean =&gt; JobDetailFactoryBean和CronTriggerBean =&gt; CronTriggerFactoryBean。
归功于Osy(对以下评论投票)
答案 1 :(得分:18)
最后我查了一下,Spring没有对Quartz 2的支持。要么看看最新的Spring版本是否添加了支持,或者尝试降级到Quartz 1.8.x.
答案 2 :(得分:17)
根据3.1.0.RC1 Change Log,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>
我们需要在使用CronTriggerFactoryBean
触发器的配置中迁移到Quartz 2。
答案 3 :(得分:15)
如果您使用的是Spring 3.x&amp; Quartz 2.1.x ......
然后在您的配置文件中只进行两次更改 1st:for Simple Trigger
使用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”