Skip to content

Commit 8f9c8b6

Browse files
committed
Updated based on code review
Updated to add regression tests for @EnableTask to verify no negative impact when in use.
1 parent a73bb0b commit 8f9c8b6

File tree

17 files changed

+239
-144
lines changed

17 files changed

+239
-144
lines changed

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@
141141
<spring-batch.version>4.1.0.BUILD-SNAPSHOT</spring-batch.version>
142142
<commons-logging.version>1.1</commons-logging.version>
143143
<java-ee-api.version>8.0</java-ee-api.version>
144+
<junit.version>5.3.1</junit.version>
144145

145146
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
146147
<sonar.jacoco.reportPath>${project.build.directory}/coverage-reports/jacoco-ut.exec</sonar.jacoco.reportPath>

spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerTests.java

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
4040
import org.springframework.cloud.task.batch.configuration.TaskBatchAutoConfiguration;
4141
import org.springframework.cloud.task.batch.configuration.TaskJobLauncherAutoConfiguration;
42+
import org.springframework.cloud.task.batch.listener.TaskBatchTest;
43+
import org.springframework.cloud.task.configuration.EnableTask;
4244
import org.springframework.cloud.task.configuration.SimpleTaskAutoConfiguration;
4345
import org.springframework.cloud.task.configuration.SingleTaskConfiguration;
4446
import org.springframework.cloud.task.repository.TaskExecution;
@@ -81,6 +83,26 @@ public void testTaskJobLauncherCLRSuccessFail() {
8183
assertThat(isExceptionThrown).isTrue();
8284
}
8385

86+
/**
87+
* Verifies that the task will return an exit code other than zero if the
88+
* job fails with the deprecated EnableTask annotation.
89+
*/
90+
@Test
91+
public void testTaskJobLauncherCLRSuccessFailWithAnnotation() {
92+
String[] enabledArgs = new String[] {
93+
"--spring.cloud.task.batch.failOnJobFailure=true",
94+
"--spring.batch.job.enabled=false"};// batch job enabled is turned to false so that we can use Task's JobLauncher
95+
boolean isExceptionThrown = false;
96+
try {
97+
this.applicationContext = SpringApplication
98+
.run(new Class[] { TaskJobLauncherCommandLineRunnerTests.JobWithFailureAnnotatedConfiguration.class}, enabledArgs);
99+
}
100+
catch (IllegalStateException exception) {
101+
isExceptionThrown = true;
102+
}
103+
assertThat(isExceptionThrown).isTrue();
104+
}
105+
84106
@Test
85107
public void testTaskJobLauncherPickOneJob() {
86108
String[] enabledArgs = new String[] {
@@ -131,13 +153,7 @@ private void validateContext() {
131153
}
132154

133155
@EnableBatchProcessing
134-
@ImportAutoConfiguration({
135-
PropertyPlaceholderAutoConfiguration.class,
136-
BatchAutoConfiguration.class,
137-
TaskBatchAutoConfiguration.class,
138-
TaskJobLauncherAutoConfiguration.class,
139-
SingleTaskConfiguration.class,
140-
SimpleTaskAutoConfiguration.class })
156+
@TaskBatchTest
141157
@Import(EmbeddedDataSourceConfiguration.class)
142158
public static class JobConfiguration {
143159

@@ -209,4 +225,21 @@ public RepeatStatus execute(StepContribution contribution,
209225
.build();
210226
}
211227
}
228+
229+
@EnableTask
230+
@EnableBatchProcessing
231+
@ImportAutoConfiguration({
232+
PropertyPlaceholderAutoConfiguration.class,
233+
BatchAutoConfiguration.class,
234+
TaskBatchAutoConfiguration.class,
235+
TaskJobLauncherAutoConfiguration.class,
236+
SingleTaskConfiguration.class,
237+
SimpleTaskAutoConfiguration.class })
238+
@Import(EmbeddedDataSourceConfiguration.class)
239+
public static class JobWithFailureAnnotatedConfiguration extends JobWithFailureConfiguration{
240+
241+
}
242+
243+
244+
212245
}

spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/listener/PrefixTests.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,7 @@ public void testPrefix() {
7272

7373
@Configuration
7474
@EnableBatchProcessing
75-
@ImportAutoConfiguration({ PropertyPlaceholderAutoConfiguration.class,
76-
BatchAutoConfiguration.class,
77-
TaskBatchAutoConfiguration.class,
78-
SimpleTaskAutoConfiguration.class,
79-
SingleTaskConfiguration.class })
75+
@TaskBatchTest
8076
public static class JobConfiguration {
8177

8278
@Autowired

spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/listener/TaskBatchExecutionListenerTests.java

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import org.springframework.beans.factory.FactoryBean;
4040
import org.springframework.beans.factory.annotation.Autowired;
4141
import org.springframework.boot.SpringApplication;
42-
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
4342
import org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration;
4443
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
4544
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
@@ -248,22 +247,14 @@ private TaskBatchExecutionListenerBeanPostProcessor beanPostProcessor(
248247
}
249248

250249
@EnableBatchProcessing
251-
@ImportAutoConfiguration({ PropertyPlaceholderAutoConfiguration.class,
252-
BatchAutoConfiguration.class,
253-
TaskBatchAutoConfiguration.class,
254-
SimpleTaskAutoConfiguration.class,
255-
SingleTaskConfiguration.class })
250+
@TaskBatchTest
256251
@Import(EmbeddedDataSourceConfiguration.class)
257252
public static class NoJobConfiguration {
258253

259254
}
260255

261256
@EnableBatchProcessing
262-
@ImportAutoConfiguration({ PropertyPlaceholderAutoConfiguration.class,
263-
BatchAutoConfiguration.class,
264-
TaskBatchAutoConfiguration.class,
265-
SimpleTaskAutoConfiguration.class,
266-
SingleTaskConfiguration.class })
257+
@TaskBatchTest
267258
@Import(EmbeddedDataSourceConfiguration.class)
268259
public static class JobConfiguration {
269260

@@ -288,11 +279,7 @@ public RepeatStatus execute(StepContribution contribution, ChunkContext chunkCon
288279
}
289280

290281
@EnableBatchProcessing
291-
@ImportAutoConfiguration( { PropertyPlaceholderAutoConfiguration.class,
292-
BatchAutoConfiguration.class,
293-
TaskBatchAutoConfiguration.class,
294-
SimpleTaskAutoConfiguration.class,
295-
SingleTaskConfiguration.class } )
282+
@TaskBatchTest
296283
@Import(EmbeddedDataSourceConfiguration.class)
297284
public static class JobFactoryBeanConfiguration {
298285

@@ -332,11 +319,7 @@ public boolean isSingleton() {
332319
}
333320

334321
@EnableBatchProcessing
335-
@ImportAutoConfiguration({ PropertyPlaceholderAutoConfiguration.class,
336-
BatchAutoConfiguration.class,
337-
TaskBatchAutoConfiguration.class,
338-
SimpleTaskAutoConfiguration.class,
339-
SingleTaskConfiguration.class })
322+
@TaskBatchTest
340323
@Import(EmbeddedDataSourceConfiguration.class)
341324
public static class JobConfigurationMultipleDataSources {
342325

@@ -389,11 +372,7 @@ public DefaultBatchConfigurer batchConfigurer() {
389372
}
390373

391374
@EnableBatchProcessing
392-
@ImportAutoConfiguration({ PropertyPlaceholderAutoConfiguration.class,
393-
BatchAutoConfiguration.class,
394-
TaskBatchAutoConfiguration.class,
395-
SimpleTaskAutoConfiguration.class,
396-
SingleTaskConfiguration.class })
375+
@TaskBatchTest
397376
@Import(EmbeddedDataSourceConfiguration.class)
398377
public static class MultipleJobConfiguration {
399378

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright 2018 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.cloud.task.batch.listener;
18+
19+
import java.lang.annotation.Documented;
20+
import java.lang.annotation.ElementType;
21+
import java.lang.annotation.Retention;
22+
import java.lang.annotation.RetentionPolicy;
23+
import java.lang.annotation.Target;
24+
25+
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
26+
27+
/**
28+
* Contains the common configurations to run a unit test for the task batch features of
29+
* SCT.
30+
*
31+
* @author Glenn Renfro
32+
*/
33+
@Target(ElementType.TYPE)
34+
@Retention(RetentionPolicy.RUNTIME)
35+
@Documented
36+
@ImportAutoConfiguration
37+
public @interface TaskBatchTest {
38+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
org.springframework.cloud.task.batch.listener.TaskBatchTest=\
2+
org.springframework.cloud.task.batch.configuration.TaskBatchAutoConfiguration,\
3+
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
4+
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
5+
org.springframework.cloud.task.configuration.SimpleTaskAutoConfiguration,\
6+
org.springframework.cloud.task.configuration.SingleTaskConfiguration

spring-cloud-task-core/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,12 @@
9191
<artifactId>spring-boot-configuration-processor</artifactId>
9292
<optional>true</optional>
9393
</dependency>
94+
<dependency>
95+
<groupId>org.junit.jupiter</groupId>
96+
<artifactId>junit-jupiter-api</artifactId>
97+
<version>${junit.version}</version>
98+
<scope>test</scope>
99+
</dependency>
94100
</dependencies>
95101

96102
</project>

spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/EnableTask.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@
5353
* </ul>
5454
*
5555
* @author Glenn Renfro
56+
*
57+
* @deprecated The EnableTask annotation is no longer be required to initialize
58+
* Spring Cloud Task. This will be handled by Spring Boot AutoConfiguration.
5659
*/
5760
@Deprecated
5861
@Target(ElementType.TYPE)

spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/SimpleTaskAutoConfiguration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3434
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3535
import org.springframework.cloud.task.listener.TaskLifecycleListener;
36-
import org.springframework.cloud.task.listener.annotation.TaskListenerExecutorObjectProvider;
36+
import org.springframework.cloud.task.listener.TaskListenerExecutorObjectFactory;
3737
import org.springframework.cloud.task.repository.TaskExplorer;
3838
import org.springframework.cloud.task.repository.TaskNameResolver;
3939
import org.springframework.cloud.task.repository.TaskRepository;
@@ -140,7 +140,7 @@ protected void initialize() throws Exception {
140140
this.taskExplorer = taskConfigurer.getTaskExplorer();
141141

142142
this.taskLifecycleListener = new TaskLifecycleListener(this.taskRepository, taskNameResolver(),
143-
this.applicationArguments, taskExplorer, taskProperties, new TaskListenerExecutorObjectProvider(context));
143+
this.applicationArguments, taskExplorer, taskProperties, new TaskListenerExecutorObjectFactory(context));
144144

145145
initialized = true;
146146
}

spring-cloud-task-core/src/main/java/org/springframework/cloud/task/listener/TaskLifecycleListener.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import org.springframework.boot.context.event.ApplicationFailedEvent;
3737
import org.springframework.boot.context.event.ApplicationReadyEvent;
3838
import org.springframework.cloud.task.configuration.TaskProperties;
39-
import org.springframework.cloud.task.listener.annotation.TaskListenerExecutorObjectProvider;
4039
import org.springframework.cloud.task.repository.TaskExecution;
4140
import org.springframework.cloud.task.repository.TaskExplorer;
4241
import org.springframework.cloud.task.repository.TaskNameResolver;
@@ -47,6 +46,7 @@
4746
import org.springframework.context.SmartLifecycle;
4847
import org.springframework.context.event.ContextRefreshedEvent;
4948
import org.springframework.util.Assert;
49+
import org.springframework.util.CollectionUtils;
5050
import org.springframework.util.StringUtils;
5151

5252
/**
@@ -79,15 +79,13 @@ public class TaskLifecycleListener implements ApplicationListener<ApplicationEve
7979

8080
private List<TaskExecutionListener> taskExecutionListeners;
8181

82-
private boolean isTaskExecutionListenersInitialized;
83-
8482
private final static Log logger = LogFactory.getLog(TaskLifecycleListener.class);
8583

8684
private final TaskRepository taskRepository;
8785

8886
private final TaskExplorer taskExplorer;
8987

90-
private final TaskListenerExecutorObjectProvider taskListenerExecutorObjectProvider;
88+
private final TaskListenerExecutorObjectFactory taskListenerExecutorObjectFactory;
9189

9290
private TaskExecution taskExecution;
9391

@@ -116,19 +114,19 @@ public TaskLifecycleListener(TaskRepository taskRepository,
116114
TaskNameResolver taskNameResolver,
117115
ApplicationArguments applicationArguments, TaskExplorer taskExplorer,
118116
TaskProperties taskProperties,
119-
TaskListenerExecutorObjectProvider taskListenerExecutorObjectProvider) {
117+
TaskListenerExecutorObjectFactory taskListenerExecutorObjectFactory) {
120118
Assert.notNull(taskRepository, "A taskRepository is required");
121119
Assert.notNull(taskNameResolver, "A taskNameResolver is required");
122120
Assert.notNull(taskExplorer, "A taskExplorer is required");
123121
Assert.notNull(taskProperties, "TaskProperties is required");
124-
Assert.notNull(taskListenerExecutorObjectProvider, "A TaskListenerExecutorObjectFactory is required");
122+
Assert.notNull(taskListenerExecutorObjectFactory, "A TaskListenerExecutorObjectFactory is required");
125123

126124
this.taskRepository = taskRepository;
127125
this.taskNameResolver = taskNameResolver;
128126
this.applicationArguments = applicationArguments;
129127
this.taskExplorer = taskExplorer;
130128
this.taskProperties = taskProperties;
131-
this.taskListenerExecutorObjectProvider = taskListenerExecutorObjectProvider;
129+
this.taskListenerExecutorObjectFactory = taskListenerExecutorObjectFactory;
132130
}
133131

134132
/**
@@ -233,7 +231,13 @@ else if (this.listenerFailed || this.applicationFailedEvent != null) {
233231
private void doTaskStart() {
234232

235233
if(!this.started) {
236-
getTaskExecutionListeners();
234+
this.taskExecutionListeners = new ArrayList<>();
235+
this.taskListenerExecutorObjectFactory.getObject();
236+
if(!CollectionUtils.isEmpty(this.taskExecutionListenersFromContext)) {
237+
this.taskExecutionListeners.addAll(this.taskExecutionListenersFromContext);
238+
}
239+
this.taskExecutionListeners.add(this.taskListenerExecutorObjectFactory.getObject());
240+
237241
List<String> args = new ArrayList<>(0);
238242

239243
if(this.applicationArguments != null) {
@@ -386,12 +390,4 @@ public void destroy() throws Exception {
386390
this.doTaskEnd();
387391
}
388392

389-
private void getTaskExecutionListeners() {
390-
this.taskExecutionListeners = new ArrayList<>();
391-
this.taskListenerExecutorObjectProvider.getObject();
392-
if(this.taskExecutionListenersFromContext != null) {
393-
this.taskExecutionListeners.addAll(this.taskExecutionListenersFromContext);
394-
}
395-
this.taskExecutionListeners.add(this.taskListenerExecutorObjectProvider.getObject());
396-
}
397393
}

0 commit comments

Comments
 (0)