繁体   English   中英

Spring Batch 中的复制作业

[英]Duplication Job in 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 模块化但仍然错误

@EnableBatchProcessing(modular = true)

封装结构

也许有人可以帮忙。 谢谢

就我而言,我在不同的包中定义了多个作业,但是如果我一次创建多个作业(通过切换 @Configuration),应用程序会抛出一个 duplicateJobConfiguration 异常。 在研究了 Google 和 StackOverflow 提供的几乎所有解决方案后,我偶然发现了我的解决方案,即从包含 Job bean 的类中删除一个样板后处理器,该后处理器已从某处的代码示例中复制进来:

@Bean
public JobRegistryBeanPostProcessor edwJobRegistryBeanPostProcessor(JobRegistry 
 jobRegistry) {
    JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor = new 
     JobRegistryBeanPostProcessor();
 jobRegistryBeanPostProcessor.setJobRegistry(jobRegistry);
 return jobRegistryBeanPostProcessor;
}

不知何故,JobRegistryBeanPostProcessor 的多个实例触发了错误,即使每个实例都有一个唯一的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM