Quartz出现FactoryBean which is currently in creation returned null from getObject

本文探讨了在Spring框架中配置Quartz时遇到的问题:同一JobDetail不能被多个Bean重复引用。文章详细解释了这一限制的原因,并提供了如何避免错误的具体实践。
这个错误提示有些不解

但在我配置Spring+Quartz的时候,经过反复的查Google和试验

发现,在Spring中,同一个JobDetail不能注入到两个不同的Bean里面

[color=red]也就是要想在两个Bean里面同时使用,就必须配置两个JobDetail

同样,在Java代码当中使用也是一样的,JobDetail的名字不可以相同,否则就会报错[/color]
<think>我们正在解决SpringBoot2.5集成Quartz时出现的“thereisnodatasourcenamenull”错误。根据引用内容,我们知道在Quartz配置文件中,数据源名称需要指向Spring管理的bean,并且连接提供者需要设置为`org.jbpm.springboot.quartz.SpringConnectionProvider`。同时,引用[2]提到我们可以使用`@Autowired`注解来自动注入数据源。这个错误通常是由于Quartz无法找到指定的数据源引起的。可能的原因和解决方案如下:1.配置问题:在`application.properties`或`application.yml`中配置Quartz的数据源时,需要确保数据源的名称正确,并且在Quartz配置中引用了这个名称。2.数据源Bean未定义:我们需要在Spring中定义一个数据源Bean,并确保其名称与Quartz配置中引用的名称一致。3.Quartz配置:在Quartz配置中,我们需要指定连接提供者为`org.jbpm.springboot.quartz.SpringConnectionProvider`,这样Quartz才能使用Spring管理的数据源。具体步骤:步骤1:在SpringBoot项目中配置数据源(例如,在`application.properties`中配置主数据源)。步骤2:创建一个用于Quartz的数据源Bean。注意,如果Quartz需要使用独立的数据源(非Spring默认管理的数据源),我们需要显式定义一个Bean。步骤3:配置Quartz属性,指定数据源名称和连接提供者。示例配置:假设我们使用`application.properties`:首先,配置主数据源(这里以H2内存数据库为例):```spring.datasource.url=jdbc:h2:mem:testdbspring.datasource.driverClassName=org.h2.Driverspring.datasource.username=saspring.datasource.password=```然后,为Quartz定义一个数据源(如果使用与主数据源相同的数据源,则不需要额外定义,但Quartz配置中需要指向Spring管理的默认数据源名称)。但根据错误信息,我们需要确保Quartz配置中引用的数据源名称存在。在`application.properties`中添加Quartz配置:```#启用Quartz的JDBC存储spring.quartz.job-store-type=jdbc#配置Quartz数据源(这里我们使用主数据源,也可以配置一个独立的数据源)#注意:如果使用独立数据源,需要定义两个数据源Bean,并指定Quartz使用哪一个spring.quartz.properties.org.quartz.dataSource.myDS.driver=org.h2.Driverspring.quartz.properties.org.quartz.dataSource.myDS.URL=jdbc:h2:mem:testdbspring.quartz.properties.org.quartz.dataSource.myDS.user=saspring.quartz.properties.org.quartz.dataSource.myDS.password=spring.quartz.properties.org.quartz.dataSource.myDS.maxConnections=5#指定连接提供者为Spring提供的连接提供者spring.quartz.properties.org.quartz.dataSource.myDS.connectionProvider.class=org.jbpm.springboot.quartz.SpringConnectionProvider#设置调度器使用我们定义的数据源spring.quartz.properties.org.quartz.jobStore.dataSource=myDS```但是,上面的配置中,我们直接指定了数据源的连接信息,但Quartz应该使用Spring管理的数据源Bean。因此,我们实际上不需要在Quartz配置中重复指定URL、驱动等,而是通过引用Spring数据源Bean的名称。根据引用[1],在Quartz配置文件中,数据源名称(如`myDS`)应该对应一个Spring数据源Bean的名称(即`quartzDataSource`)。因此,我们需要:1.定义一个数据源Bean,名称为`quartzDataSource`(或者你在配置中指定的名称,如引用[1]中配置了`org.quartz.dataSource.myDS.dataSourceName=quartzDataSource`,那么`myDS`对应的Spring数据源Bean名称为`quartzDataSource`)。2.在配置中设置`org.quartz.dataSource.myDS.connectionProvider.class=org.jbpm.springboot.quartz.SpringConnectionProvider`。因此,我们可以这样配置:在`application.properties`中:```#主数据源配置(如果Quartz使用独立数据源,则不需要这个,或者另外配置)#但这里我们假设Quartz使用一个独立的数据源,所以我们需要配置两个数据源。#主应用数据源spring.datasource.url=jdbc:h2:mem:appdbspring.datasource.driver-class-name=org.h2.Driverspring.datasource.username=saspring.datasource.password=#Quartz数据源配置(独立数据源)spring.quartz-datasource.url=jdbc:h2:mem:quartzdbspring.quartz-datasource.driver-class-name=org.h2.Driverspring.quartz-datasource.username=saspring.quartz-datasource.password=#Quartz属性配置spring.quartz.job-store-type=jdbcspring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTXspring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegatespring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_spring.quartz.properties.org.quartz.jobStore.isClustered=true#配置Quartz数据源(myDS)指向SpringBean(名称为quartzDataSource)spring.quartz.properties.org.quartz.dataSource.myDS.connectionProvider.class=org.jbpm.springboot.quartz.SpringConnectionProviderspring.quartz.properties.org.quartz.dataSource.myDS.dataSourceName=quartzDataSourcespring.quartz.properties.org.quartz.jobStore.dataSource=myDS```然后,我们需要定义两个数据源Bean:一个用于应用(主数据源),另一个用于Quartz(名称为`quartzDataSource`)。我们可以使用`@Bean`注解来定义:```java@ConfigurationpublicclassDataSourceConfig{@Bean@Primary@ConfigurationProperties(prefix="spring.datasource")publicDataSourceappDataSource(){returnDataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix="spring.quartz-datasource")publicDataSourcequartzDataSource(){returnDataSourceBuilder.create().build();}}```这样,Quartz配置中指定的`myDS`数据源就会使用我们定义的`quartzDataSource`Bean。如果错误仍然存在,请检查:-是否在配置中正确指定了`dataSourceName`(即SpringBean的名称)?-是否配置了正确的`connectionProvider.class`?-是否在Quartz的`jobStore`中指定了数据源名称(`org.quartz.jobStore.dataSource=myDS`)?另外,如果使用的是SpringBoot的自动配置,确保没有排除`DataSourceAutoConfiguration`,除非我们手动配置了所有数据源。最后,如果问题仍然存在,请检查类路径中是否有`jbpm-spring-boot-starter-quartz`或类似依赖,因为它提供了`SpringConnectionProvider`。如果没有,可能需要添加依赖:Maven:```xml<dependency><groupId>org.jbpm</groupId><artifactId>jbpm-spring-boot-starter-quartz</artifactId><version>适当版本</version></dependency>```但注意,通常我们并不需要这个依赖,我们可以使用SpringBoot自带的Quartz集成。实际上,SpringBoot已经为Quartz提供了自动配置,并且可以使用`@QuartzDataSource`注解来定义Quartz的独立数据源。因此,更简单的做法是使用SpringBoot的`@QuartzDataSource`注解:步骤:1.在`application.properties`中配置两个数据源:主数据源和Quartz数据源(使用不同的配置前缀)。2.使用`@QuartzDataSource`注解定义Quartz的数据源Bean,这样SpringBoot会自动将这个数据源用于Quartz。示例:在配置类中:```java@ConfigurationpublicclassDataSourceConfig{@Bean@Primary@ConfigurationProperties(prefix="spring.datasource")publicDataSourceappDataSource(){returnDataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix="spring.quartz-datasource")@QuartzDataSourcepublicDataSourcequartzDataSource(){returnDataSourceBuilder.create().build();}}```然后在`application.properties`中,我们只需要配置Quartz使用JDBC存储,并设置相关属性,但不需要指定连接提供者类,因为SpringBoot已经处理了:```spring.quartz.job-store-type=jdbcspring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTXspring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegatespring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_spring.quartz.properties.org.quartz.jobStore.isClustered=true```这样,SpringBoot会自动将`@QuartzDataSource`注解的数据源用于Quartz,避免了手动配置连接提供者。总结:出现“thereisnodatasourcenamenull”错误,主要是因为Quartz没有找到数据源。我们可以通过显式定义Quartz使用的数据源Bean,并在配置中正确引用(或者使用`@QuartzDataSource`)来解决。如果使用`@QuartzDataSource`,则不需要配置`org.quartz.dataSource.*.connectionProvider.class`和`dataSourceName`,因为SpringBoot的自动配置会处理。因此,建议使用`@QuartzDataSource`注解的方式。如果问题仍未解决,请检查日志,确认Quartz初始化时使用的数据源配置。</think>### Spring Boot 2.5 集成 Quartz 时 "there is no datasource name null" 错误解决方案 #### 错误原因分析 此错误通常由以下原因导致: 1. **数据源配置缺失**:Quartz 未正确识别 Spring 管理的数据源 2. **连接提供者配置错误**:未使用 `SpringConnectionProvider` 桥接 QuartzSpring 数据源 3. **Bean 名称不匹配**:Quartz 配置中引用的数据源名称与 Spring Bean 名称不一致[^1] #### 完整解决方案 ##### 步骤 1:配置数据源 Bean 在 `application.properties` 中配置主数据源和 Quartz 数据源: ```properties # 主数据源 (应用使用) spring.datasource.url=jdbc:mysql://localhost:3306/main_db spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # Quartz 专用数据源 spring.quartz-datasource.url=jdbc:mysql://localhost:3306/quartz_db spring.quartz-datasource.username=quartz_user spring.quartz-datasource.password=quartz_pass spring.quartz-datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` ##### 步骤 2:定义数据源 Bean 创建配置类声明两个数据源 Bean: ```java @Configuration public class DataSourceConfig { @Bean @Primary @ConfigurationProperties(prefix = "spring.datasource") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.quartz-datasource") public DataSource quartzDataSource() { return DataSourceBuilder.create().build(); } } ``` ##### 步骤 3:配置 Quartz 属性 在 `application.properties` 中添加关键 Quartz 配置: ```properties # 启用JDBC存储模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值