Inject event publisher into TaskJobLauncherApplicationRunner

This commit is contained in:
Henning Poettker
2023-02-08 22:51:32 +01:00
parent 30ce8f944f
commit 4ea9b9fa21
2 changed files with 46 additions and 10 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2020-2022 the original author or authors.
* Copyright 2020-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,6 +26,8 @@ import org.springframework.batch.core.repository.JobRepository;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.boot.autoconfigure.batch.BatchProperties;
import org.springframework.cloud.task.batch.handler.TaskJobLauncherApplicationRunner;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
@@ -35,23 +37,26 @@ import org.springframework.util.StringUtils;
* @author Glenn Renfro
* @since 2.3.0
*/
public class TaskJobLauncherApplicationRunnerFactoryBean implements FactoryBean<TaskJobLauncherApplicationRunner> {
public class TaskJobLauncherApplicationRunnerFactoryBean
implements FactoryBean<TaskJobLauncherApplicationRunner>, ApplicationEventPublisherAware {
private JobLauncher jobLauncher;
private final JobLauncher jobLauncher;
private JobExplorer jobExplorer;
private final JobExplorer jobExplorer;
private List<Job> jobs;
private final List<Job> jobs;
private String jobName;
private JobRegistry jobRegistry;
private final JobRegistry jobRegistry;
private Integer order = 0;
private Integer order;
private TaskBatchProperties taskBatchProperties;
private final TaskBatchProperties taskBatchProperties;
private JobRepository jobRepository;
private final JobRepository jobRepository;
private ApplicationEventPublisher applicationEventPublisher;
public TaskJobLauncherApplicationRunnerFactoryBean(JobLauncher jobLauncher, JobExplorer jobExplorer, List<Job> jobs,
TaskBatchProperties taskBatchProperties, JobRegistry jobRegistry, JobRepository jobRepository,
@@ -93,6 +98,9 @@ public class TaskJobLauncherApplicationRunnerFactoryBean implements FactoryBean<
if (this.order != null) {
taskJobLauncherApplicationRunner.setOrder(this.order);
}
if (this.applicationEventPublisher != null) {
taskJobLauncherApplicationRunner.setApplicationEventPublisher(this.applicationEventPublisher);
}
return taskJobLauncherApplicationRunner;
}
@@ -101,4 +109,9 @@ public class TaskJobLauncherApplicationRunnerFactoryBean implements FactoryBean<
return TaskJobLauncherApplicationRunner.class;
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
}

View File

@@ -39,6 +39,7 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration;
import org.springframework.boot.autoconfigure.batch.BatchProperties;
import org.springframework.boot.autoconfigure.batch.JobExecutionEvent;
import org.springframework.boot.autoconfigure.batch.JobLauncherApplicationRunner;
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
@@ -52,12 +53,14 @@ import org.springframework.cloud.task.configuration.SimpleTaskAutoConfiguration;
import org.springframework.cloud.task.configuration.SingleTaskConfiguration;
import org.springframework.cloud.task.repository.TaskExecution;
import org.springframework.cloud.task.repository.TaskExplorer;
import org.springframework.context.ApplicationListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import static org.assertj.core.api.Assertions.assertThat;
@@ -159,6 +162,9 @@ public class TaskJobLauncherApplicationRunnerTests {
assertThat(jobExecutionIds.size()).isEqualTo(1);
assertThat(taskExplorer.getTaskExecution(jobExecutionIds.iterator().next()).getExecutionId()).isEqualTo(1);
JobExecutionEventListener listener = this.applicationContext.getBean(JobExecutionEventListener.class);
assertThat(listener.getEventCounter()).isEqualTo(1);
}
private void validateForFail(String errorMessage, Class<?> clazz, String[] enabledArgs) {
@@ -169,8 +175,24 @@ public class TaskJobLauncherApplicationRunnerTests {
.withMessage(errorMessage);
}
@Component
private static class JobExecutionEventListener implements ApplicationListener<JobExecutionEvent> {
private int eventCounter = 0;
@Override
public void onApplicationEvent(JobExecutionEvent event) {
eventCounter++;
}
public int getEventCounter() {
return eventCounter;
}
}
@TaskBatchTest
@Import(EmbeddedDataSourceConfiguration.class)
@Import({ EmbeddedDataSourceConfiguration.class, JobExecutionEventListener.class })
@EnableTask
public static class JobConfiguration {
@@ -191,6 +213,7 @@ public class TaskJobLauncherApplicationRunnerTests {
}
@Configuration(proxyBeanMethods = false)
@Import(JobExecutionEventListener.class)
public static class TransactionManagerTestConfiguration {
@Bean