spring quartz强制使用RAMJobStore解决办法

本文介绍了如何在Spring中配置Quartz使用RAMJobStore而非默认的JDBCJobStore。通过调整SchedulerFactoryBean的配置,可以避免因任务无法序列化而导致的问题,并简化部署流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring quartz强制使用RAMJobStore
作者:sunshy 日期:2009-08-13

在 spring里用quartz时,因为quartz调用的是一个业务层的操作,配置文件里有个datesource,这样以来spring默认会给 quartz装载datesource,即quartz被设成了JDBCJobStore模式,这样就出问题了,一方面我需要在数据库中增加十来张表,另一方面当我们的任务不能被序列化的时候,存储数据库的时候会报错!

你说简简单单的RAMJobStore多好,当然如果你的调动任务比较复杂的时候用JDBCJobStore来持久维持状态也有可取之处,这里不讨论RAMJobStore和JDBCJobStore的区别,如感兴趣可看这篇文章。这里我要讨论的就是怎么干掉JDBCJobStore模式。

首先一个尝试,在spring配置中的SchedulerFactoryBean设置:

<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">1</prop>
<!--<prop key="org.quartz.threadPool.threadPriority">4</prop>-->
<prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
<prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
</props>
</property>

测试好像没起作用,经查,发现时spring自动装载在作祟。这里有一篇介绍的文章。我是在spring配置最外层加了default-autowire="byName"属性,当然这个是有用的,因为我类中都用了@autowire自动装载,这个地方不能改。所以只能在SchedulerFactoryBean这个bean里改,这样既不影响全局,也实现了quartz强制使用 RAMJobStore的需求:

<bean id="cmsScheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no">
<property name="triggers">
<list>
<ref bean="simplePublishJobTrigger"/>
<ref bean="cronPublishJobTrigger"/>
</list>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">1</prop>
<!--<prop key="org.quartz.threadPool.threadPriority">4</prop>-->
<prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
<prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
</props>
</property>
</bean>
<think>好的,我需要回答用户在Spring Boot中集成Quartz而不使用数据库的配置示例。首先,我应该回顾QuartzSpring Boot中的基本配置,通常Quartz默认使用数据库来存储任务信息,但用户想要避免这一点,所以需要使用内存存储(RAMJobStore)。 接下来,我需要确认如何配置Quartz使用数据库。根据Spring Boot的文档,通常通过配置文件(如application.properties)来设置属性。关键的属性是`org.quartz.jobStore.class`,应该设置为`org.quartz.simpl.RAMJobStore`,这样Quartz就会使用内存存储,而不是JDBCJobStore。 然后,需要确保其他相关配置正确,比如关闭集群模式,因为内存存储不支持集群。所以应该设置`org.quartz.jobStore.isClustered`为false,并且调整线程池的大小以适应内存存储的需求。 另外,用户可能需要一个示例代码来配置Quartz的JobDetail和Trigger。这里需要用Spring的`@Configuration`类来定义Bean,比如使用JobBuilder和TriggerBuilder来创建任务和触发器。 还需要注意依赖管理。用户需要在pom.xml或build.gradle中添加Spring Boot Starter Quartz的依赖,确保没有引入jdbc相关的依赖,或者排除掉自动配置的数据源部分,避免应用尝试连接数据库。 可能的问题点包括:是否真的禁用了数据库,是否正确覆盖了默认配置,以及内存存储的局限性,比如任务信息在应用重启后会丢失。需要提醒用户这一点。 最后,生成相关的问题,比如如何持久化任务,如何配置集群,或者如何结合其他存储方式。同时,确保引用正确的文档部分,比如Spring Integration的JDBC初始化配置可能不是直接相关,但如果有涉及属性配置的部分,需要正确引用。</think>在Spring Boot中集成Quartz而不使用数据库(即基于内存存储)的配置方法如下: ### 步骤1:添加依赖 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` ### 步骤2:配置application.properties ```properties # 强制使用内存存储 org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore # 禁用集群模式 org.quartz.jobStore.isClustered=false # 设置线程池配置 org.quartz.threadPool.threadCount=5 ``` ### 步骤3:定义Job和Trigger配置类 ```java @Configuration public class QuartzConfig { @Bean public JobDetail sampleJobDetail() { return JobBuilder.newJob(SampleJob.class) .withIdentity("sampleJob") .storeDurably() .build(); } @Bean public Trigger sampleJobTrigger() { SimpleScheduleBuilder schedule = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) .repeatForever(); return TriggerBuilder.newTrigger() .forJob(sampleJobDetail()) .withIdentity("sampleTrigger") .withSchedule(schedule) .build(); } } ``` ### 步骤4:实现Job类 ```java public class SampleJob implements Job { @Override public void execute(JobExecutionContext context) { System.out.println("Quartz job executed at: " + new Date()); } } ``` 关键配置说明: 1. `RAMJobStore` 将任务存储在内存中[^1] 2. 禁用`isClustered`确保不尝试连接数据库 3. 线程池配置需与内存存储兼容 4. 注意内存存储的任务会在应用重启后丢失
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值