Весенний пакетный перезапуск - PullRequest
0 голосов
/ 26 апреля 2020

Я новичок в 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());

1 Ответ

0 голосов
/ 27 апреля 2020

В Spring Batch экземпляр задания идентифицируется (идентифицируя) параметрами задания. Пожалуйста, проверьте язык домена раздела Batch , чтобы понять разницу между понятиями Job, JobInstance и JobExecution и как параметры используются для идентификации экземпляров задания.

Я попытался остановить пакетную середину процесса и запустить снова. Он всегда выполняет новое задание.

В вашем случае, поскольку вы добавляете текущее время в качестве параметра задания при каждом запуске, здесь:

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

в итоге вы получите разные экземпляры работы каждый раз. Если вы хотите снова запустить тот же экземпляр задания, вам нужно передать ту же метку времени первой попытки в качестве параметра задания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...