From b19556c21719aedbb50d225db4acd40911fc27d2 Mon Sep 17 00:00:00 2001 From: Henning Poettker Date: Wed, 8 Feb 2023 22:51:32 +0100 Subject: [PATCH] Inject event publisher into `TaskJobLauncherApplicationRunner` Polished on cherry-pick --- ...bLauncherApplicationRunnerFactoryBean.java | 31 +++++++++++++------ ...TaskJobLauncherApplicationRunnerTests.java | 29 ++++++++++++++--- 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherApplicationRunnerFactoryBean.java b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherApplicationRunnerFactoryBean.java index e689a0b6..2c795881 100644 --- a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherApplicationRunnerFactoryBean.java +++ b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherApplicationRunnerFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2020-2020 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; @@ -36,23 +38,24 @@ import org.springframework.util.StringUtils; * @since 2.3.0 */ public class TaskJobLauncherApplicationRunnerFactoryBean - implements FactoryBean { + implements FactoryBean, ApplicationEventPublisherAware { + private final JobLauncher jobLauncher; - private JobLauncher jobLauncher; + private final JobExplorer jobExplorer; - private JobExplorer jobExplorer; - - private List jobs; + private final List jobs; private String jobNames; - 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 jobs, @@ -96,6 +99,9 @@ public class TaskJobLauncherApplicationRunnerFactoryBean if (this.order != null) { taskJobLauncherApplicationRunner.setOrder(this.order); } + if (this.applicationEventPublisher != null) { + taskJobLauncherApplicationRunner.setApplicationEventPublisher(this.applicationEventPublisher); + } return taskJobLauncherApplicationRunner; } @@ -104,4 +110,9 @@ public class TaskJobLauncherApplicationRunnerFactoryBean return TaskJobLauncherApplicationRunner.class; } + @Override + public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { + this.applicationEventPublisher = applicationEventPublisher; + } + } diff --git a/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherApplicationRunnerTests.java b/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherApplicationRunnerTests.java index aba166d9..778adc2b 100644 --- a/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherApplicationRunnerTests.java +++ b/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherApplicationRunnerTests.java @@ -43,6 +43,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration; +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; @@ -54,12 +55,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.Import; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.scheduling.concurrent.ConcurrentTaskExecutor; +import org.springframework.stereotype.Component; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -174,8 +177,11 @@ public class TaskJobLauncherApplicationRunnerTests { page.iterator().next().getExecutionId()); assertThat(jobExecutionIds.size()).isEqualTo(1); - assertThat(taskExplorer.getTaskExecution(jobExecutionIds.iterator().next()) - .getExecutionId()).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) { @@ -192,9 +198,24 @@ public class TaskJobLauncherApplicationRunnerTests { }); } + @Component + private static class JobExecutionEventListener implements ApplicationListener { + + private int eventCounter = 0; + + @Override + public void onApplicationEvent(JobExecutionEvent event) { + eventCounter++; + } + + public int getEventCounter() { + return eventCounter; + } + + } @EnableBatchProcessing @TaskBatchTest - @Import(EmbeddedDataSourceConfiguration.class) + @Import({ EmbeddedDataSourceConfiguration.class, JobExecutionEventListener.class }) @EnableTask public static class JobConfiguration { @@ -224,7 +245,7 @@ public class TaskJobLauncherApplicationRunnerTests { BatchAutoConfiguration.class, TaskBatchAutoConfiguration.class, TaskJobLauncherAutoConfiguration.class, SingleTaskConfiguration.class, SimpleTaskAutoConfiguration.class }) - @Import(EmbeddedDataSourceConfiguration.class) + @Import({EmbeddedDataSourceConfiguration.class, JobExecutionEventListener.class}) @EnableTask public static class JobWithFailureConfiguration {