java - Spring Batch 中的复制作业
问题描述
升级到 Spring 2.x 后出现错误无法注册作业配置,因为 DuplicationJobException
已经检查过了,我的代码中没有重复的名称。
错误
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:558)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobCalcSampleDetail' defined in class path resource [id/co/a/microservice/batch/job/SampleJobConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.beans.FatalBeanException: Cannot register job configuration; nested exception is org.springframework.batch.core.configuration.DuplicateJobException: A job configuration with this name [jobCalcSampleDetail] was already registered
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:849)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
at id.co.a.microservice.batch.NcsBatchServiceApplication.main(NcsBatchServiceApplication.java:15)
... 6 more
Caused by: org.springframework.beans.FatalBeanException: Cannot register job configuration; nested exception is org.springframework.batch.core.configuration.DuplicateJobException: A job configuration with this name [jobCalcSampleDetail] was already registered
at org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor.postProcessAfterInitialization(JobRegistryBeanPostProcessor.java:150)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:429)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
... 21 more
Caused by: org.springframework.batch.core.configuration.DuplicateJobException: A job configuration with this name [jobCalcSampleDetail] was already registered
at org.springframework.batch.core.configuration.support.MapJobRegistry.register(MapJobRegistry.java:52)
at org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor.postProcessAfterInitialization(JobRegistryBeanPostProcessor.java:146)
... 24 more
作业配置代码
@Configuration
@EnableBatchProcessing
public class SampleJobConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
public PostgresDbConfig postgres;
@Value("${xxx.chunk.default}")
private int chunkSize;
@Value("${xxx.limit.retry}")
private int retryLimit;
@Bean
@StepScope
public Tasklet taskletRmvSample(@Value("#{jobParameters['period']}") String period,
@Value("#{jobParameters['clearData']}") Boolean clearData) {
return (StepContribution stepContribution, ChunkContext chunkContext) -> {
if (clearData) {
new JdbcTemplate(postgres.dataSource()).execute("");
}
return RepeatStatus.FINISHED;
};
}
@Bean
public Step step1RmvSample() {
return stepBuilderFactory.get("step1RmvSampleDetail").tasklet(
taskletRmvSample(null, null)).build();
}
@Bean
public Job jobCalcSampleDetail() throws Exception {
return jobBuilderFactory.get("jobCalcSampleDetail").incrementer(new RunIdIncrementer()).start(
step1RmvSample()).build();
}
}
主要应用代码
@SpringBootApplication
@EnableDiscoveryClient
@EnableScheduling
public class NcsBatchServiceApplication {
public static void main(String[] args) {
SpringApplication.run(NcsBatchServiceApplication.class, args);
}
}
使用 Spring Boot Parent 2.1.4 - Spring Batch Core 4.1.1
以前它在使用 spring 1.5.17 时工作正常,但在升级到 spring 2.* 后是错误的。
还尝试添加 make modules 但仍然错误
@EnableBatchProcessing(modular = true)
封装结构图片
也许有人可以帮忙。谢谢
解决方案
在我的情况下,我在不同的包中定义了多个作业,但是如果我一次创建多个作业(通过切换@Configuration),应用程序会抛出一个重复的JobConfiguration 异常。在完成了 Google 和 StackOverflow 提供的几乎所有解决方案之后,我偶然发现了我的解决方案,该解决方案是从包含 Job bean 的类中删除一个样板后处理器,该样板后处理器是从某处的代码示例中复制的:
@Bean
public JobRegistryBeanPostProcessor edwJobRegistryBeanPostProcessor(JobRegistry
jobRegistry) {
JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor = new
JobRegistryBeanPostProcessor();
jobRegistryBeanPostProcessor.setJobRegistry(jobRegistry);
return jobRegistryBeanPostProcessor;
}
JobRegistryBeanPostProcessor 的多个实例以某种方式触发了错误,即使每个实例都有一个唯一的名称。
推荐阅读
- java - 如何从外部库创建用于测试的对象
- json - 从视图中传递 JsonData 并在视图中接收 JSON 返回值
- amazon-web-services - 控制台中的 Amazon Cognito 用户池设备跟踪配置如何映射到相应的 CloudFormation 模板配置?
- php - 带有 PHP 和服务帐户的 Google 日历 API 将不再工作
- powershell - 从 XML 中的数据中搜索并获取内容,然后使用 powershell 将该值放在另一个标签中
- android - 如何使用 spotify sdk 或 Web API 在 android 应用程序中播放音乐?
- mp3 - iOS 14 Safari canPlayType('audio/mpeg; codecs="mp3"') 返回 ""
- c++ - opengl glDepthRange 对象在 Z 深度上消失
- python - 熊猫在一列上使用 group by,然后在另一列上使用 max 得到非重复值
- php - 如何找到从 laravel websocket 网络服务器发送的信息?