Springbatch — изменение моего приложения, чтобы я мог передавать параметры задания в свою настройку

#java #spring #spring-batch

#java #весна #spring-batch

Вопрос:

В настоящее время у меня есть приложение Springbatch, подобное этому:

 @SpringBootApplication
@EnableBatchProcessing
public class Application {

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);

}
}
  

У меня есть файл конфигурации репозитория, который использует локальную базу данных h2 для обслуживания репозитория заданий, создания joblauncher и других вещей. Существенная часть этого поста:

 protected JobLauncher createJobLauncher() throws Exception {

    SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
    jobLauncher.setJobRepository(jobRepository);

    jobLauncher.afterPropertiesSet();
    return jobLauncher;
}
  

Наконец, у меня есть компонент job в другом файле конфигурации:

 @Bean
public Job databaseCursorJob(@Qualifier("databaseCursorStep") Step exampleJobStep,
                             JobBuilderFactory jobBuilderFactory) {
    return jobBuilderFactory.get("databaseCursorJob")
            .incrementer(new RunIdIncrementer())
            .flow(exampleJobStep)
            .end()
            .build();
}
  

Мне нужно иметь возможность передавать параметры задания, такие как:

 JobParameters jobParameters = new JobParametersBuilder()
            .addDate("date", new Date())
            .toJobParameters();
  

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

 jobLauncher.run(job, new JobParameters());
  

, но я на самом деле никогда не вызываю этот метод, как я предполагаю, потому что я использую приложение springboot, сортировка выполняется под обложками, предположительно, через аннотацию @EnableBatchProcessing в приложении.

Итак, мне нужно перенастроить мое приложение, чтобы изменить способ запуска задания, чтобы иметь возможность передавать параметры задания. Однако мне не удалось выяснить это. Я был бы признателен за любые идеи. Спасибо.

Комментарии:

1. Это должно помочь: github.com/spring-guides/gs-batch-processing/issues/15

Ответ №1:

хорошо, у меня есть решение. На это мне указал мой хороший друг мистер Хассин, который, похоже, умеет находить решения для springbatch, которые я не смог найти сам!

Следуя ссылке мистера Хсссина:https://github.com/spring-guides/gs-batch-processing/issues/15

Я взял свое оригинальное приложение:

 @SpringBootApplication
@EnableBatchProcessing
public class Application {

    public static void main(String[] args) {
       SpringApplication.run(Application.class, args);

    }
}
  

и заменил:

 @SpringBootApplication
public class Application {

public static void main(String[] args) throws Exception {
        
    ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args);

    JobLauncher jobLauncher = applicationContext.getBean(JobLauncher.class);
    Job job = applicationContext.getBean(Job.class);

    JobParameters jobParameters = new JobParametersBuilder()
            .addDate("date", new Date())
            .toJobParameters();

    jobLauncher.run(job, jobParameters);
}
  

}

Кроме того, мне пришлось добавить:

 spring.batch.job.enabled=false
  

в мой application.properties, который заставляет springboot обходить автоматическое волшебство JobLauncher.run(job, jobParameters) и вместо этого ищет любой альтернативный запуск, который я предоставил в своем основном классе в приведенном выше коде. Таким образом, я мог бы напрямую добавить параметр jobParameter, который добавляет временную метку, чтобы гарантировать, что каждый экземпляр задания однозначно идентифицирован, что (надеюсь) предотвратит тщетные попытки spring перезапустить потерянные экземпляры заданий со старыми идентификаторами экземпляров заданий.