java - 升级到 spring 4.2.5 导致quartz调度程序启动错误

标签 java spring maven spring-mvc quartz

升级到 spring 4.2.5 导致quartz调度器出现启动问题 -

NoSuchMethodError : org.quartz.Scheduler.getListenerManager() 

Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'intAppService' defined in file [SaPvApp-context.xml]: Cannot resolve reference to bean 'quartzScheduler' while setting bean property 'quartzScheduler'; nested exception is org.springframework.beans.factory.Bean

CreationException: Error creating bean with name 'quartzScheduler' defined in file [C:\Integration Apps\SAPV\config\SaPvApp-context.xml]: 
Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.quartz.Scheduler.getListenerManager()Lorg/quartz/ListenerManager;

来自 pom:

<dependency>
  <groupId>org.opensymphony.quartz</groupId>
  <artifactId>quartz</artifactId>
  <version>1.6.5</version>
</dependency>

来自上下文文件:

<bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="autoStartup" value="false" />
    <property name="schedulerName" value="PvScheduler" />
    <property name="triggers">
        <list>
            <!-- <ref bean="cronTrigger" /> -->
        </list>
    </property>
</bean>

<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="serviceTask" />
    <property name="targetMethod" value="run" />
    <property name="concurrent" value="false" />
    <property name="group" value="PV" />
    <property name="name" value="${app.service.name}${app.service.instance}-Job" />
    <property name="jobListenerNames">
        <list>
            <!-- <value>PvJobListener</value> -->
        </list>
    </property>
</bean>

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="jobDetail" />
    <!--<property name="cronExpression" value="10 0/01 * * * ?"  />-->
    <!-- run twice a day at 3am and 3pm -->
     <property name="cronExpression" value="0 0 3,15 ? * *"  />
    <!-- run every 30 minutes, at 10 seconds after the minute (i.e. 10:00:10 am, 10:30:10 am, etc.) 
    <property name="cronExpression" value="10 0/30 * * * ?"  />  -->
</bean>

编辑:尝试将quartz升级到2.2.2:

    /**
 * Listen for Job and Scheduler events.
 */
public void listen() {
    if (this.quartzScheduler != null) {
        try {
            this.quartzScheduler.addJobListener(this);
            this.quartzScheduler.addSchedulerListener(this);
        }
        catch (SchedulerException e) {
            throw new IntegrationServiceException("listen", e);
        }
    }
}

错误:

类型 Scheduler 未定义方法 addJobListener(QuartzTaskScheduler)

类型 Scheduler 未定义方法 addSchedulerListener(QuartzTaskScheduler)

编辑 2017 年 4 月 3 日: 我能够通过将abstract=”true”添加到我的bean定义来解决抽象错误,但是,我在下面发布了一个新错误:

Error creating bean with name 'jobDetail' defined in file [C:\Integration Apps\SAPV\config\SaPvApp-context.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'jobListenerNames' of bean class 

[org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean]: Bean property 'jobListenerNames' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1518)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1226)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:753)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
        at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:140)
        at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:84)
        at AbstractCommandLineApplication.runApplication(AbstractCommandLineApplication.java:93)
        at AbstractCommandLineApplication.runApplication(AbstractCommandLineApplication.java:54)
        at cmd.SaPvApp.main(SaPvApp.java:18)
Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'jobListenerNames' of bean class [org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean]: Bean property 'jobListenerNames' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
        at org.springframework.beans.BeanWrapperImpl.createNotWritablePropertyException(BeanWrapperImpl.java:231)
        at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:423)
        at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:280)
        at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:95)
        at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:75)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1514)
        ... 15 more

编辑 2017 年 4 月 3 日 pt2: 我注释掉了 jobListernersNames 并得到了一个新错误:

org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.scheduling.quartz.CronTriggerBean] for bean with name 'cronTrigger' defined in file [C:\Integration Apps\SAPV\config\SaPvApp-context.xml]; nested exception is java.lang.ClassNotFoundException: 

org.springframework.scheduling.quartz.CronTriggerBean
        at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1352)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:628)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:597)
        at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1445)
        at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:975)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:752)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
        at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:140)
        at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:84)
        at AbstractCommandLineApplication.runApplication(AbstractCommandLineApplication.java:93)
        at AbstractCommandLineApplication.runApplication(AbstractCommandLineApplication.java:54)
        at cmd.SaPvApp.main(SaPvApp.java:18)
Caused by: java.lang.ClassNotFoundException: org.springframework.scheduling.quartz.CronTriggerBean
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at org.springframework.util.ClassUtils.forName(ClassUtils.java:250)
        at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:394)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1397)
        at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1344)
        ... 12 more

这是 context.xml 文件的状态(请注意,如果我将引用添加回 cronTrigger,则会出现原始错误:

<bean name="intAppService" class="QuartzTaskScheduler" init-method="listen" abstract="true">
    <property name="name" value="PvJobListener" />
    <property name="quartzScheduler" ref="quartzScheduler"/>
</bean>

<bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="autoStartup" value="false" />
    <property name="schedulerName" value="PvScheduler" />
    <property name="triggers">
        <list>
            <!--<ref bean="cronTrigger" />-->
        </list>
    </property>
</bean>

<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="serviceTask" />
    <property name="targetMethod" value="run" />
    <property name="concurrent" value="false" />
    <property name="group" value="PV" />
    <property name="name" value="${app.service.name}${app.service.instance}-Job" />
    <!--<property name="jobListenerNames">
        <list>
            <value>PvJobListener</value>
        </list>
    </property>-->
</bean>

<bean name="serviceTask" class="SaPvService">
    <property name="serviceTaskName" value="${app.service.name}${app.service.instance}"/>
    <property name="hoursRepository" ref="hoursRepository"/>
    <property name="primaveraSessionService" ref="primaveraSessionService"/>
    <property name="resourceRateProcessor" ref="resourceRateProcessor"/>
    <property name="workChunkRepository" ref="workChunkRepository"/>
</bean>

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="jobDetail" />
    <!--<property name="cronExpression" value="10 0/01 * * * ?"  />-->
    <!-- run twice a day at 3am and 3pm -->
     <property name="cronExpression" value="0 0 3,15 ? * *"  />
    <!-- run every 30 minutes, at 10 seconds after the minute (i.e. 10:00:10 am, 10:30:10 am, etc.) 
    <property name="cronExpression" value="10 0/30 * * * ?"  />  -->
</bean>

编辑 2017 年 4 月 3 日 pt2 a: 我将 cronTrigger 引用放回其中,这是这种情况下的错误:

上下文:

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="jobDetail" />
    <!--<property name="cronExpression" value="10 0/01 * * * ?"  />-->
    <!-- run twice a day at 3am and 3pm -->
     <property name="cronExpression" value="0 0 3,15 ? * *"  />
    <!-- run every 30 minutes, at 10 seconds after the minute (i.e. 10:00:10 am, 10:30:10 am, etc.) 
    <property name="cronExpression" value="10 0/30 * * * ?"  />  -->
</bean>

<bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="autoStartup" value="false" />
    <property name="schedulerName" value="PvScheduler" />
    <property name="triggers">
        <list>
            <ref bean="cronTrigger" />
        </list>
    </property>
</bean>

错误:

2017-04-03 14:34:22,792 WARN {main} [org.springframework.context.support.FileSystemXmlApplicationContext] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.scheduling.quartz.CronTriggerBean] for bean with name 'cronTrigger' defined in file [C:\Integration Apps\SAPV\config\SaPvApp-context.xml]; nested exception is java.lang.ClassNotFoundException: org.springframework.scheduling.quartz.CronTriggerBean
*** SaPvApp: Unexpected service error at Mon Apr 03 14:34:23 CDT 2017
org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.scheduling.quartz.CronTriggerBean] for bean with name 'cronTrigger' defined in file [C:\Integration Apps\SAPV\config\SaPvApp-context.xml]; nested exception is java.lang.ClassNotFoundException: org.springframework.scheduling.quartz.CronTriggerBean
        at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1352)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:628)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:597)
        at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1445)
        at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:975)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:752)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
        at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:140)
        at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:84)
        at AbstractCommandLineApplication.runApplication(AbstractCommandLineApplication.java:93)
        at AbstractCommandLineApplication.runApplication(AbstractCommandLineApplication.java:54)
        at cmd.SaPvApp.main(SaPvApp.java:18)
Caused by: java.lang.ClassNotFoundException: org.springframework.scheduling.quartz.CronTriggerBean
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at org.springframework.util.ClassUtils.forName(ClassUtils.java:250)
        at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:394)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1397)
        at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1344)
        ... 12 more

更新时间:2017 年 4 月 3 日 14:55(中部时间): 我更改了上下文文件 CronTriggerBean 现在是 CronTriggerFactoryBean 现在我收到此错误:

2017-04-03 14:52:47,570 INFO {main} [org.quartz.core.QuartzScheduler] - 

Scheduler meta-data: Quartz Scheduler (v2.2.2) 'PvScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

2017-04-03 14:52:47,572 INFO {main} [org.quartz.impl.StdSchedulerFactory] - Quartz scheduler 'PvScheduler' initialized from an externally provided properties instance.
2017-04-03 14:52:47,574 INFO {main} [org.quartz.impl.StdSchedulerFactory] - Quartz scheduler version: 2.2.2
2017-04-03 14:52:47,576 INFO {main} [org.quartz.core.QuartzScheduler] - JobFactory set to: org.springframework.scheduling.quartz.AdaptableJobFactory@749ad37c
*** SaPvApp: Registering JVM shutdown hook
*** SaPvApp: version 17.1.0
*** SaPvApp: Adding service-stop event listeners
*** SaPvApp: Starting service at Mon Apr 03 14:52:47 CDT 2017
*** SaPvApp: Unexpected service error at Mon Apr 03 14:52:47 CDT 2017
org.springframework.beans.factory.BeanIsAbstractException: Error creating bean with name 'intAppService': Bean definition is abstract
        at org.springframework.beans.factory.support.AbstractBeanFactory.checkMergedBeanDefinition(AbstractBeanFactory.java:1288)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:285)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1054)
        at AbstractCommandLineApplication.runApplication(AbstractCommandLineApplication.java:112)
        at AbstractCommandLineApplication.runApplication(AbstractCommandLineApplication.java:54)
        at cmd.SaPvApp.main(SaPvApp.java:18)
*** SaPvApp: Calling service stop event listeners
*** SaPvApp: Exiting service at Mon Apr 03 14:52:47 CDT 2017
*** SaPvApp ShutdownHook: Service shutdown initiated at Mon Apr 03 14:52:47 CDT 2017
*** SaPvApp ShutdownHook: Closing application context
2017-04-03 14:52:47,609 INFO {ApplicationShutdownHook} [org.springframework.context.support.FileSystemXmlApplicationContext] - Closing org.springframework.context.support.FileSystemXmlApplicationContext@63e31ee: startup date [Mon Apr 03 14:52:41 CDT 2017]; root of context hierarchy
2017-04-03 14:52:47,615 INFO {ApplicationShutdownHook} [org.springframework.context.support.DefaultLifecycleProcessor] - Stopping beans in phase 2147483647
2017-04-03 14:52:47,618 INFO {ApplicationShutdownHook} [org.springframework.scheduling.quartz.SchedulerFactoryBean] - Shutting down Quartz Scheduler
2017-04-03 14:52:47,619 INFO {ApplicationShutdownHook} [org.quartz.core.QuartzScheduler] - Scheduler PvScheduler_$_NON_CLUSTERED shutting down.
2017-04-03 14:52:47,620 INFO {ApplicationShutdownHook} [org.quartz.core.QuartzScheduler] - Scheduler PvScheduler_$_NON_CLUSTERED paused.
2017-04-03 14:52:47,621 INFO {ApplicationShutdownHook} [org.quartz.core.QuartzScheduler] - Scheduler PvScheduler_$_NON_CLUSTERED shutdown complete.
*** SaPvApp ShutdownHook: Service shutdown complete

编辑 2017 年 4 月 4 日 07:59: 我尝试创建一个父抽象类

    <bean name="intAppServiceParent" abstract = "true">
    <property name="nameParent" value="PvJobListenerParent" />
    <property name="quartzSchedulerParent" ref="quartzSchedulerParent"/>
</bean>

<bean name="intAppService" class="QuartzTaskScheduler" init-method="listen" parent = "intAppServiceParent">
    <property name="name" value="PvJobListener" />
    <property name="quartzScheduler" ref="quartzScheduler"/>
</bean>

但我收到此错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'intAppService' defined in file [C:\Integration Apps\SAPV\config\SaPvApp-context.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [QuartzTaskScheduler]: Is it an abstract class?; nested exception is java.lang.InstantiationException

如果我不将 java 代码类抽象化,我会收到一个关于此的编译错误:

The type QuartzTaskScheduler must implement the inherited abstract method SchedulerListener.triggersPaused(String)

我不知道如何解决这个问题?

最佳答案

我发布了分散在评论中的解决方案步骤作为答案,以便更轻松地找到这些步骤。

升级到具有 Quartz 集成的 Spring 4.2.5 所需的一些步骤:

  1. Spring 4.2.5 使用quartz 2.2.2,无法与Quartz 1.x 配合使用,因此必须更新Quartz 版本。
  2. addJobListener()addSchedulerListener() 方法已从 QuartzScheduler 移至 ListenerManager,可通过 getListenerManager() 方法。
  3. setJobListenerNames() 方法已删除,因此不应在 XML 配置中设置 jobListenerNames

关于java - 升级到 spring 4.2.5 导致quartz调度程序启动错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43147698/

相关文章:

java - 从 GitHub 加载 Maven 依赖项

java - 使用正则表达式匹配非单词字符但不匹配笑脸

java - HashCode 循环调用 : OneToMany JPA

java - 使用 Spring 从 Angular 表单中恢复数据

java - 在 Spring 中使用 postForEntity 时错误的 POST 正文 JSON 序列化

java - Maven 不会安装 pom 文件中的所有内容,导致 "Missing Required Library"x 124

java - Tomcat 使用 BASIC auth 而不是 FORM auth

java - 如何声明变量

Spring Boot 2.0 Prometheus 向后兼容性

java - 如何从 WAR 中排除文件夹?