当我将 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 {
*****
}
}
如果您使用Spring 3.1,
用 SimpleTriggerFactoryBean 替换 SimpleTriggerBean
在 3.1 版本中,Spring 为 crontrigger 和 simpletrigger 创建了工厂类
更新:
使用Spring 3.2.2,更改JobDetailBean也一定有用=> JobDetailFactoryBean 和 CronTriggerBean => CronTriggerFactoryBean。
感谢 Osy(对下面的评论进行投票)
上次我检查过,Spring 不支持 Quartz 2。要么查看最新的 Spring 版本是否添加了上述支持,要么尝试降级到 Quartz 1.8.x。
根据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>
CronTriggerFactoryBean
触发器的配置中迁移到 Quartz 2。
如果您使用 Spring 3.x 和 Quartz 2.1.x…
然后在您的配置文件中仅进行两处更改 第一:用于简单触发器
使用
class=”org.springframework.scheduling.quartz.SimpleTriggerFactoryBean”>
代替
class=”org.springframework.scheduling.quartz.SimpleTriggerBean”>
第二个:用于 Cron 触发器 使用
class=”org.springframework.scheduling.quartz.CronTriggerFactoryBean”
代替
class=”org.springframework.scheduling.quartz.CronTriggerBean”
就我而言,问题是由重复的库引起的。我在 pom.xml 中包含了排除项。
<dependency>
<groupId>org.apache.openejb</groupId>
<artifactId>openejb-core-hibernate</artifactId>
<version>5.0.0-SNAPSHOT</version>
<type>pom</type>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.openejb.shade</groupId>
<artifactId>quartz-openejb-shade</artifactId>
</exclusion>
</exclusions>
</dependency>