繁体   English   中英

如何使用不同的参数同时启动同一个 spring-batch 作业?

[英]How to start the same spring-batch job concurrently with different parameters?

我想使用不同的filename参数多次启动相同的作业配置,以同时导入多个文件(每个作业一个文件)。

@Configuration
public class MyJob {

    //the steps contain each a reader, processor and writer
    //reader is @JobScope
    @Bean
    public Job job(Step someStep, Step, someMoreStep) {
        System.out.println("registering job bean");
        return jobBuilderFactory.get(name)
            .start(someStep)
            .next(someMoreStep)
            .build();
    }
}

@Component
public class MyImporter {
    @Autowired
    private JobRegistry jobRegistry;

    @Autowired
    private JobLauncher launcher;

    private static final String FILENAME = "baseFilename";

    @Async
    public void run(String i) {
        p = new JobParametersBuilder();
        p.addDate("date", new Date());
        p.addString("filename", FILENAME + i + ".csv"); //injected via @Value jobParameter to job

        Job job = jobRegistry.getJob("getMyJob");
        launcher.run(job, p.toJobParameters());
    }
}

@Component
public class MyImportManager {
    @Autowired
    private MyImporter importer;

    //starts a  job multiple times with different "filename" parameters,
    //to simulate concurrent file imports with the same configuration job class
    public void start() {
        for (int i = 0; i < 4; i++) {
            importer.run(i);
        }
    }
}

@SpringBootApplication
@EnableBatchProcessing(modular = true)
@EnableAsync
public class MyConfig {

}

问题:我可以开始多个工作,但他们似乎使用相同的reader 如果我运行单个作业i < 1 ,则一切正常。 如果我增加i ,我会收到奇怪的输入。

我正在使用 FlatFileItemReader,其中每个值都被逐行读取。 但是当使用并发导入(来自不同的文件)时,输入字符串通常会损坏。

所以我假设我没有为并发导入正确注册作业? 但为什么?

有趣的是: "registering job bean"这一行只打印了一次。 但是它不应该在异步作业开始时经常打印吗?

FlatFileItemReader不是线程安全的,因此您的阅读器 bean 需要在“作业”范围内。 然后您将获得每个作业一个实例。

@Bean
@JobScope
public FlatFileItemReader<?> yourReaderBean(
        @Value("#{jobParameters[filename]}") String filename){
    FlatFileItemReader<?> itemReader = new FlatFileItemReader<?>();
    itemReader.setLineMapper(lineMapper());
    itemReader.setResource(new ClassPathResource(filename));
    return itemReader;
}

暂无
暂无

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

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