You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring4.3.27整合Quartz2.3.2后任务不触发问题排查求助

故障根因

该问题由Spring 4.3.27与Quartz 2.3.2的版本兼容性差异、配置冲突两类原因导致,Quartz 2.2+版本对事务处理、执行器优先级、Job持久化规则做了不兼容调整,原本在2.1.1版本生效的配置不再适配高版本规则。

具体配置错误与修复方案


1. 错误配置Scheduler全局事务切面,干扰Quartz内置事务逻辑

你当前对整个org.quartz.Scheduler接口加了全局事务拦截,Quartz 2.3.x的JobStore本身已经内置了调度操作的事务边界,外部事务切面会导致事务提交延迟、锁超时,虽然调度线程可以正常更新QUARTZ_TRIGGERS的next_fire_time,但任务提交到执行器时会被事务拦截静默丢弃。

修复方式:

直接删除以下两段配置,任务本身的事务控制直接加在你的业务Job方法上即可,不要拦截Quartz原生Scheduler接口:

<!-- 删除该aop配置 -->
<aop:config>
    <aop:pointcut id="quartzSchedulerPointcut"
        expression="execution(* org.quartz.Scheduler.*(..))" />
    <aop:advisor advice-ref="quartzSchedulerAdvice"
        pointcut-ref="quartzSchedulerPointcut" />
</aop:config>

<!-- 删除该事务通知配置 -->
<tx:advice id="quartzSchedulerAdvice">
    <tx:attributes>
        <tx:method name="get*" read-only="true" propagation="SUPPORTS" />
        <tx:method name="set*" read-only="true" propagation="SUPPORTS" />
        <!-- 省略其余属性 -->
    </tx:attributes>
</tx:advice>

2. 双执行器配置冲突

你同时在SchedulerFactoryBean中注入了Spring的workManagerTaskExecutor,又在quartz.properties中配置了Quartz内置的SimpleThreadPool,Quartz 2.1.1版本优先使用Spring注入的执行器,2.3.x版本优先级逻辑变更导致两个执行器冲突,任务线程无法绑定上下文被丢弃。

修复方式二选一:

  • 方案A:沿用WebSphere的WorkManager执行器
    删除quartz.properties中的以下3行配置:
    org.quartz.threadPool.class  =  org.quartz.simpl.SimpleThreadPool
    org.quartz.threadPool.threadCount  =  15
    org.quartz.threadPool.threadPriority  =  15
    
    同时在SchedulerFactoryBean中补充上下文暴露配置:
    <property name="exposeSchedulerInContext" value="true"/>
    
  • 方案B:沿用Quartz内置线程池
    直接删除SchedulerFactoryBean中的taskExecutor注入配置:
    <property name="taskExecutor" ref="workManagerTaskExecutor" />
    

3. JobDetail缺少持久化属性配置

Quartz 2.2+版本要求JobDetail必须显式指定durability属性,2.1.1版本默认值为true,高版本默认逻辑变更后未配置该属性会导致任务触发一次就被标记为非持久化从调度器中移除,只会更新触发器时间不会实际执行。

修复方式:

修改JobDetailFactoryBean配置,补充持久化属性:

<bean name="job1"
    class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
    <property name="jobClass" value="com.jobs.scheduleJob" />
    <property name="durability" value="true" />
</bean>

4. Bean引用大小写不匹配

SchedulerFactoryBean的jobDetails配置中引用的是Job1(首字母大写),但实际定义的JobDetail bean name是job1(首字母小写),Spring bean默认大小写敏感,会导致任务实际未被注册到调度器。

修复方式:

修正引用大小写:

<property name="jobDetails">
    <list>
        <ref bean="job1" />
    </list>
</property>

5. 可选:消除日志告警

日志中的No TaskScheduler/ScheduledExecutorService bean found for scheduled processing是Spring自带@Scheduled注解扫描的告警,和Quartz无关,如果不需要使用Spring自带的调度注解,直接删除<task:annotation-driven />配置即可消除告警。


验证标准

修改完成后启动服务,确认QUARTZ_TRIGGERS表的next_fire_time更新的同时prev_fire_time也会同步更新,业务任务逻辑正常执行即可。

内容的提问来源于stack exchange,提问作者Jana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:06:05