Как заставить Spring Batch Job запускаться при запуске, а не по расписанию - PullRequest
0 голосов
/ 02 января 2019

У меня есть приложение Spring Batch, которое работает нормально, но настроено по расписанию. Как я могу запустить его один раз при запуске и завершить выполнение после его завершения?

Вот конфигурация:

@Scheduled(fixedRate = 500000)
public void runJob() {
    try {
        JobParameters jobParameters = new JobParametersBuilder().addLong(
                "time", System.currentTimeMillis()).toJobParameters();
        jobLauncher.run(processJob, jobParameters);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Bean
public Job processJob() {
    return jobBuilderFactory.get("processJob")
            .incrementer(new RunIdIncrementer()).listener(listener())
            .flow(orderStep1()).end().build();
}

и приложение основного класса:

   @SpringBootApplication(scanBasePackages= "com.companyName")
   @EnableBatchProcessing
   @EnableScheduling
   public class ExpansionDBApplication{

    public static void main(String[] args) throws Exception {
       SpringApplication.run(ExpansionDBApplication.class, args);
    }
   }

Edit: После удаления аннотаций @Scheduled и @EnableScheduling задание не запускается и появляется 2 предупреждения:

2019-01-03 09:20:54.438  WARN 14476 --- [  restartedMain] o.s.c.a.ConfigurationClassEnhancer       : @Bean method ScopeConfiguration.stepScope is non-static and returns an object assignable to Spring's BeanFactoryPostProcessor interface. This will result in a failure to process annotations such as @Autowired, @Resource and @PostConstruct within the method's declaring @Configuration class. Add the 'static' modifier to this method to avoid these container lifecycle issues; see @Bean javadoc for complete details.
2019-01-03 09:20:54.444  WARN 14476 --- [  restartedMain] o.s.c.a.ConfigurationClassEnhancer       : @Bean method ScopeConfiguration.jobScope is non-static and returns an object assignable to Spring's BeanFactoryPostProcessor interface. This will result in a failure to process annotations such as @Autowired, @Resource and @PostConstruct within the method's declaring @Configuration class. Add the 'static' modifier to this method to avoid these container lifecycle issues; see @Bean javadoc for complete details.

Они относятся к этим полям:

@Autowired
private JobBuilderFactory jobBuilderFactory;

@Autowired
private StepBuilderFactory stepBuilderFactory;

@Autowired
private JobLauncher jobLauncher;

@Autowired
private Job processJob;

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Вы также можете переопределить метод запуска и управлять выполнением задания с помощью аргументов программы.

Это может быть полезно, если вы настроили более одного задания.

@SpringBootApplication(scanBasePackages = "com.companyName")
@EnableBatchProcessing
class ExpansionDBApplication implements CommandLineRunner {
  @Autowired
  private JobLauncher jobLauncher;
  @Autowired
  private ListableJobLocator listableJobLocator;

  public static void main(String[] args) {
    SpringApplication app = new SpringApplication(ExpansionDBApplication.class);
    app.run(args);
  }

  @Override
  public void run(String... args) throws JobExecutionException {
    SimpleCommandLinePropertySource source = new SimpleCommandLinePropertySource(args);
    String jobName = source.getProperty("job.name");
    if (jobName == null || jobName.isEmpty()) {
      executeAllJobs();
    } else {
      executeJob(jobName);
    }
  }

  private void executeJob(String jobName) throws JobExecutionException {
    JobParameters jobParameters = new JobParametersBuilder()
            .addString("uid", UUID.randomUUID().toString())
            .toJobParameters();
    jobLauncher.run(listableJobLocator.getJob(jobName), jobParameters);
  }

  private void executeAllJobs() throws JobExecutionException {
    for (String jobName : listableJobLocator.getJobNames()) {
      executeJob(jobName);
    }
  }
}
0 голосов
/ 02 января 2019

У меня есть приложение Spring Batch, которое работает нормально, но настроено по расписанию, как я могу запустить его один раз при запуске и завершить выполнение после его завершения?

Хорошо, просто удалите конфигурацию планирования (@EnableScheduling и @Scheduled(fixedRate = 500000)), и она запустится при запуске и завершится после завершения.

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