Spring 批量重启

Spring Batch restart

我是 Spring Batch 的新手。我有一些关于重启的问题。我知道默认情况下启用重启功能。我需要做任何额外的代码来重新启动任何工作吗?哪些作业可以重新启动。如何测试我的批处理应用程序是否可重启。我试图再次停止批处理过程和 运行。它总是在执行新作业。

下面是我的代码:

@Bean
    @Qualifier("dataTransferJob")
    public Job dataJob() {

        return jobBuilderFactory.get("data-transfer-job")
                .listener(jobExecutionListener())
                .flow(step()).end().build();
    }

    @Bean
    public Step step() {
        return stepBuilderFactory.get("data-transfer-step")
                .<TestData, TestDataVO>chunk(100)
                .reader(reader())
                .processor(process())
                .writer(writer)
                .taskExecutor(threadPool)
                .transactionManager(transactionManager)
                .listener(stepExecutionListener())
                .listener(chunkListener())
                .throttleLimit(10)
                .build();
    }

    @PersistenceContext
    private EntityManager em;

    @Bean(destroyMethod="")
    public ItemReader<TestData> reader() {
        JpaPagingItemReader<TestData> itemReader = new JpaPagingItemReader<>();
        try {
            String sqlQuery = "SELECT * FROM TEST_DATA";
            JpaNativeQueryProvider<TestData> queryProvider = new JpaNativeQueryProvider<TestData>();
            queryProvider.setSqlQuery(sqlQuery);
            queryProvider.setEntityClass(TestData.class);
            queryProvider.afterPropertiesSet();

            itemReader.setEntityManagerFactory(em.getEntityManagerFactory());

            itemReader.setPageSize(100);
            itemReader.setQueryProvider(queryProvider);
            itemReader.afterPropertiesSet();
            itemReader.setSaveState(true);
        }
        catch (Exception e) {
            System.out.println("BatchConfiguration.reader() ==> error " + e.getMessage());
        }
        return itemReader;    

    }

然后使用 CommandLineRunner 午餐工作

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    @Qualifier("dataTransferJob")
    Job dataJob;

    JobParametersBuilder paramsBuilder = new JobParametersBuilder();
    paramsBuilder.addString("date", LocalDateTime.now().toString());

    JobExecution jobExecution=jobLauncher.run(dataJob, paramsBuilder.toJobParameters());

在 Spring 批处理中,作业实例由(标识)作业参数标识。请查看 The domain language of Batch 部分以了解 JobJobInstanceJobExecution 概念之间的差异以及如何使用参数来识别作业实例。

I tried to stop the batch middle of process and run again. It always executing a new job.

在你的情况下,因为你要在每个 运行 上添加当前时间作为作业参数:

JobParametersBuilder paramsBuilder = new JobParametersBuilder();
paramsBuilder.addString("date", LocalDateTime.now().toString());

你每次都会得到不同的作业实例。如果你想再次启动同一个作业实例,你需要将第一次尝试的相同时间戳作为作业参数传递。