我有一个批处理配置。我看到批处理过程默认使用InMemoryMap
。相反,我需要使用MySQL按批处理发送所有执行细节。但是当我使用以下代码时,我收到以下错误,
创建名称为“batchDataSource”的 Bean 时出错:请求的 Bean 当前正在创建中:是否存在无法解析的循环引用?
@Configuration
@EnableBatchProcessing
public class BatchProcess extends DefaultBatchConfigurer {
private @Autowired Environment env;
@Bean
@StepScope
public ItemReader reader() {
...
}
@Bean
@StepScope
public ItemProcessor processor() {
...
}
@Bean
@StepScope
public ItemWriter writer() {
...
}
@Bean
@Primary
public DataSource batchDataSource() {
HikariDataSource hikari = new HikariDataSource();
hikari.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
hikari.setJdbcUrl(env.getProperty("spring.datasource.url"));
hikari.setUsername(env.getProperty("spring.datasource.username"));
hikari.setPassword(env.getProperty("spring.datasource.password"));
return hikari;
}
public JobRepository getJobRepository() {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDataSource(batchDataSource());
factory.setTransactionManager(manager());
factory.afterPropertiesSet();
return factory.getObject();
}
public PlatformTransactionManager manager() {
return new ResourcelessTransactionManager();
}
@Bean
public Step step() {
return stepBuilderFactory.get("step")
.chunk(1000)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
@Bean
public Job job() {
return jobBuilderFactory.get("job")
.flow(step())
.end()
.build();
}
@Bean
public JobLauncher getJobLauncher() {
SimpleJobLauncher launcher = new SimpleJobLauncher();
launcher.setJobRepository(createJobRepository());
return launcher;
}
}
在我正在使用属性文件中,
spring.batch.job.enabled=false
spring.batch.initialize-schema=always
我错过了什么?我正在使用JPA。甚至为什么它不使用可用的JPA数据源?如何在MemoryMap中强制Spring批处理使用默认MySQL代替?
首先,在pom中明确定义mysql连接器依赖项。xml并从项目中删除与内存映射相关的任何内容。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
如果您想手动使用bean定义自己的配置,则无法使用AutoConfiguration类,因为它们会在启动时自动为您创建所需的bean,如果您定义自己的自定义DB配置类,这可能会导致问题。因此,您必须排除DataSourceAutoConfiguration
、HibernateJpaAutoConfiguration
和DataSourceTransactionManagerAutoConfiguration
来解决问题。
只需更新<code>@SpringBootApplication
@SpringBootApplication(
exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class
}
)
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
您收到的错误消息可能不是最清楚的,但它应该为您指出正确的方向。您的代码中似乎有一个循环依赖项。
当您有两个(或更多)相互依赖的beansss时,就会发生这种情况,从而防止在没有另一个bean存在的情况下创建另一个bean(反之亦然),这就是众所周知的鸡和蛋的问题。通常可以通过setter注入和某种构造后初始化来避免这种情况。
我认为您已经通过扩展<code>DefaultBatchConfigurer
这完全没有必要,因为< code > DefaultBatchConfigurer 已经按照正确的顺序为您创建了< code>JobRepository 、< code>JobExplorer和< code>JobLauncher。
从DefaultBatchConfigurer:
@PostConstruct
public void initialize() {
try {
this.jobRepository = createJobRepository();
this.jobExplorer = createJobExplorer();
this.jobLauncher = createJobLauncher();
} catch (Exception e) {
throw new BatchConfigurationException(e);
}
}
如果您要扩展DefaultBatchConfigrer
,那么我建议您从代码中删除以下方法:
manager()
< Li > < code > getjob launcher()
从代码示例中可以看出,您似乎已经在设置以下属性(在应用程序.properties
文件中?):
spring.datasource.jdbcUrl=...
spring.datasource.username=...
spring.datasource.password=...
spring.datasource.driverClassName=...
这应该足以允许Spring的自动配置为您自动创建Hikari<code>数据源数据源,这将通过setDataSource()
自动连接到DefaultBatchConfigurer
。
但是,在您的代码示例中,您还定义了一个名为batchDataSource()
的@Bean
注释方法,它看起来与您应该从Spring AutoConfiguration接收的内容没有什么不同。只要您配置了前面提到的spring.datasource
属性,您也应该能够消除batchDataSource()
,但我认为这没有必要,所以您的选择。
如果您仍然想要手动配置您的< code>DataSource,那么我建议您不要扩展< code > DefaultBatchConfigurer ,而是在一个配置类中为它定义一个自定义bean,在那里您可以直接传入您的自定义< code>DataSource(基于我目前对您的用例的了解)。
@Bean
public BatchConfigurer batchConfigurer(){
return new DefaultBatchConfigurer( batchDataSource() );
}
一切都开始了,因为Spring Cloud AWS没有正确配置SimpleStorage原型解决方案。此类负责在使用ResourceLoader时处理s3://协议。有关更多详细信息,请参阅问题:无法在Spring AWS示例上强制转换为org.springframework.core.io.WritableResource。 所以,我不得不手动创建它。但我也在使用LocalStack解决方案(h
我正在从事SpringBoot与Spring集成项目。升级应用程序时,我遇到以下错误(仅在pivotal cloud上,而不是本地)- 上下文初始化期间遇到异常-取消刷新尝试:org。springframework。豆。工厂未满足的依赖项异常:创建名为“cloudDataBaseConfiguration”的bean时出错:通过字段“cloud”表示未满足的依赖项:创建名为“cloudMultiH
我已经在我的Spring Boot应用程序中实现了一个调度程序例程,使用Quartz Scheduler遵循本教程(sping-boo-quitz-demo),并为我的目的做了一些修改。 例如,我的作业服务必须能够列出数据库中的所有对象及其子对象,设置新值并最终更新。所有这些都必须是事务性的。 出于某种原因,MyWork类不允许在其中声明事务性方法,所以我通过注入一个带有事务性方法的新服务类来解决
我有以下错误:创建名为'securityConfig'的bean时出错:请求的bean当前正在创建中:是否有不可解析的循环引用? 我该怎么解决呢?
当打开同时使用这两个bean的页面时,我会看到异常: 请告知如何修复此异常。 编辑:我尝试使用setter注入,正如答案中所引用的那样
原因:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“Hibernate Configuration”的bean时出错:通过字段“ReadDataSource01”表示的不满足依赖项;嵌套异常为org.springframework.beans.factory.BeanCreationException:创