Quartz配置问题

本文介绍了使用Spring框架集成Quartz实现定时任务的过程,并详细解析了一种常见的配置错误及其解决方案。作者通过实践发现未给SchedulerFactoryBean指定ID会导致Job无法正确注册的问题。

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

1.由于项目需求需要用到定时任务,因此我做了一个demo。我照着官方文档抄下来的,结果报了下面的错误信息。令我百思不得其解,后来各种资料都没找到问题,一下是我刚开始的spring配置文件,再下面是我的错误信息。

<span style="white-space:pre">	</span><bean id="sendTiming" class="com.××××.××××.ucp.quartz.SendTiming"></bean>

	 <bean id="demoJob"
		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="sendTiming" />
		<property name="targetMethod" value="doJob" />
	</bean> 

	<bean id="demoTrigger"
		class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail" ref="demoJob" />
		<property name="cronExpression" value="5 0 0 * * ?" />
	</bean> 

	<bean  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="demoTrigger" />
			</list>
		</property>
	</bean>
 

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.scheduling.quartz.SchedulerFactoryBean#1' defined in file [E:\demo\*-*-service\target\classes\META-INF\spring\quartz.xml]: Invocation of init method failed; nested exception is org.quartz.JobPersistenceException: The job (DEFAULT.myJob) referenced by the trigger does not exist.
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:681)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
	at com.alibaba.dubbo.container.spring.SpringContainer.start(SpringContainer.java:50)
	at com.alibaba.dubbo.container.Main.main(Main.java:80)
	at com.ucloudlink.bss.ucp.Main.main(Main.java:9)
Caused by: org.quartz.JobPersistenceException: The job (DEFAULT.myJob) referenced by the trigger does not exist.
	at org.quartz.simpl.RAMJobStore.storeTrigger(RAMJobStore.java:422)
	at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:932)
	at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:258)
	at org.springframework.scheduling.quartz.SchedulerAccessor.addTriggerToScheduler(SchedulerAccessor.java:357)
	at org.springframework.scheduling.quartz.SchedulerAccessor.registerJobsAndTriggers(SchedulerAccessor.java:289)
	at org.springframework.scheduling.quartz.SchedulerFactoryBean.afterPropertiesSet(SchedulerFactoryBean.java:516)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549)
	... 14 more</span>
解决问题方法:最后我查阅公司之前代码库,发现问题,竟然是因为我没给SchedulerFactoryBean加一个ID

改后的spring的配置文件

<span style="white-space:pre">	</span><bean id="demoJob"
		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="sendTiming" />
		<property name="targetMethod" value="doJob" />
	</bean> 

	<bean id="demoTrigger"
		class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail" ref="demoJob" />
		<property name="cronExpression" value="0/5 * * * * ?" />
	</bean> 

	<bean id="demoFactory"</span> class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="demoTrigger" />
			</list>
		</property>
	</bean> 


### Quartz 配置文件示例及相关说明 Quartz 是一种流行的任务调度框架,其配置主要通过 `quartz.properties` 文件完成。该文件定义了调度器的行为、线程池设置以及其他必要的参数。以下是关于 Quartz 配置文件的详细示例和说明: #### 基础配置项 以下是一个标准的 `quartz.properties` 配置文件示例[^1]: ```properties # 调度器实例名称 org.quartz.scheduler.instanceName = MySchedulerInstance # 自动生成实例 ID org.quartz.scheduler.instanceId = AUTO # 线程池配置 org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 10 org.quartz.threadPool.threadPriority = 5 # Job 存储方式(内存存储) org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore ``` - **scheduler.instanceName**: 定义调度器实例的名字。 - **scheduler.instanceId**: 如果设为 `AUTO`,则会自动分配唯一的实例 ID,在集群环境中非常有用。 - **threadPool.threadCount**: 表示线程池中可用线程的数量,默认值通常是 10。 - **jobStore.class**: 指定任务存储的方式。这里使用的是内存存储 (`RAMJobStore`),适合简单的应用场景。 #### 数据库持久化配置 当需要将任务信息保存到数据库时,可以修改 `jobStore.class` 属性,并添加相应的 JDBC 参数[^3]: ```properties # 使用数据库作为任务存储 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX # JDBC 代理类 org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate # 数据库表前缀 org.quartz.jobStore.tablePrefix = QRTZ_ # 启用集群模式 org.quartz.jobStore.isClustered = true # 集群节点检查时间间隔(单位:毫秒) org.quartz.jobStore.clusterCheckinInterval = 10000 # 数据源别名 org.quartz.dataSource.myDS.connectionProvider.class = org.quartz.utils.C3P0ConnectionProvider org.quartz.dataSource.myDS.jndiURL = java:/comp/env/jdbc/myDS ``` - **jobStore.class**: 切换至基于事务的 JDBC 实现 (`JobStoreTX`)。 - **driverDelegateClass**: 指定具体的 JDBC 代理实现。 - **tablePrefix**: 数据库中 Quartz 所有表的前缀默认为 `QRTZ_`。 - **isClustered**: 开启集群支持后,多个节点共享同一个数据库。 - **clusterCheckinInterval**: 控制集群成员之间的心跳频率。 #### Spring 整合下的 Quartz 配置 在 Spring 应用程序中,可以通过 XML 或 Java Config 方式简化 Quartz配置过程[^2]。下面展示了一个基于 Java Config 的例子: ```java @Configuration public class QuartzConfig { @Bean public JobDetail jobDetail() { return JobBuilder.newJob(MyJob.class).withIdentity("myJob").build(); } @Bean public Trigger trigger(JobDetail jobDetail) { SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) .repeatForever(); return TriggerBuilder.newTrigger().forJob(jobDetail) .withSchedule(scheduleBuilder) .build(); } @Bean public SchedulerFactoryBean schedulerFactoryBean(Trigger trigger, JobDetail jobDetail) { SchedulerFactoryBean factory = new SchedulerFactoryBean(); factory.setOverwriteExistingJobs(true); factory.setTriggers(trigger); Properties quartzProperties = new Properties(); quartzProperties.put("org.quartz.scheduler.instanceName", "SpringScheduler"); quartzProperties.put("org.quartz.threadPool.threadCount", "5"); factory.setQuartzProperties(quartzProperties); return factory; } } ``` - **JobDetail**: 定义具体要执行的任务。 - **Trigger**: 设定触发条件,比如每隔多少秒运行一次。 - **SchedulerFactoryBean**: 将 Quartz 配置封装起来并与 Spring 上下文集成。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值