Update Task to BOOT 2.1.M1
Migrating to use ApplicationContextRunner or ImportAutoConfiguration with SpringApp.run, instead of SpringApplicationBuilder, because builder does not handle AutoConfiguration properly SimpleTaskAutoConfiguration now has an annotation AutoConfigureBefore the BatchTaskAutoConfig so that it is processed prior. THis is so that that BatchTaskAutoConfig can create the appropriate beans SimpleTaskAutoConfiguration has new annotations so that it is AutoConfigured after BindingServiceConfiguration and after SimpleTaskAutoConfiguration. This is so that it does not attempt to start emitting messages before stream is ready and it can create the appropriate beans after SimpleTaskAutoConfiguration has run. Renamed SimpleTaskConfiguration to SimpleTaskAutoConfiguration. Task version updated to 2.1.0 Added missing headers Updated documentation. Deprecated EnableTask Added ability to disable Task autoconfiguration. Removed @EnableTask from tests Resolves #439 Resolves #440 Resolves #448 Resolves #466
This commit is contained in:
committed by
Michael Minella
parent
d2c90c5256
commit
d2bc2530cc
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2016 the original author or authors.
|
||||
* Copyright 2016-2018 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.
|
||||
@@ -24,6 +24,7 @@ import org.springframework.batch.core.JobExecutionListener;
|
||||
import org.springframework.batch.core.SkipListener;
|
||||
import org.springframework.batch.core.StepExecutionListener;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
@@ -33,6 +34,7 @@ import org.springframework.cloud.stream.annotation.EnableBinding;
|
||||
import org.springframework.cloud.stream.annotation.Output;
|
||||
import org.springframework.cloud.task.batch.listener.support.TaskBatchEventListenerBeanPostProcessor;
|
||||
import org.springframework.cloud.task.batch.listener.support.TaskEventProperties;
|
||||
import org.springframework.cloud.task.configuration.SimpleTaskAutoConfiguration;
|
||||
import org.springframework.cloud.task.listener.TaskLifecycleListener;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
@@ -60,6 +62,7 @@ import org.springframework.messaging.MessageChannel;
|
||||
@ConditionalOnClass(Job.class)
|
||||
@ConditionalOnBean(value = { Job.class, TaskLifecycleListener.class })
|
||||
@ConditionalOnProperty(prefix = "spring.cloud.task.batch.events", name = "enabled", havingValue = "true", matchIfMissing = true)
|
||||
@AutoConfigureAfter(SimpleTaskAutoConfiguration.class)
|
||||
public class BatchEventAutoConfiguration {
|
||||
|
||||
public final static String JOB_EXECUTION_EVENTS_LISTENER = "jobExecutionEventsListener";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2016 the original author or authors.
|
||||
* Copyright 2016-2018 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.
|
||||
@@ -15,12 +15,15 @@
|
||||
*/
|
||||
package org.springframework.cloud.task.listener;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.cloud.stream.annotation.EnableBinding;
|
||||
import org.springframework.cloud.stream.annotation.Output;
|
||||
import org.springframework.cloud.stream.config.BindingServiceConfiguration;
|
||||
import org.springframework.cloud.task.configuration.SimpleTaskAutoConfiguration;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.PropertySource;
|
||||
@@ -36,21 +39,20 @@ import org.springframework.messaging.MessageChannel;
|
||||
@ConditionalOnBean(TaskLifecycleListener.class)
|
||||
@ConditionalOnProperty(prefix = "spring.cloud.task.events", name = "enabled", havingValue = "true", matchIfMissing = true)
|
||||
@PropertySource("classpath:/org/springframework/cloud/task/application.properties")
|
||||
@AutoConfigureBefore(BindingServiceConfiguration.class)
|
||||
@AutoConfigureAfter(SimpleTaskAutoConfiguration.class)
|
||||
public class TaskEventAutoConfiguration {
|
||||
|
||||
@Configuration
|
||||
@EnableBinding(TaskEventChannels.class)
|
||||
public static class ListenerConfiguration {
|
||||
|
||||
@Autowired
|
||||
private TaskEventChannels taskEventChannels;
|
||||
|
||||
@Bean
|
||||
public GatewayProxyFactoryBean taskEventListener() {
|
||||
GatewayProxyFactoryBean factoryBean =
|
||||
new GatewayProxyFactoryBean(TaskExecutionListener.class);
|
||||
|
||||
factoryBean.setDefaultRequestChannel(taskEventChannels.taskEvents());
|
||||
factoryBean.setDefaultRequestChannelName(TaskEventChannels.TASK_EVENTS);
|
||||
|
||||
return factoryBean;
|
||||
}
|
||||
|
||||
@@ -34,15 +34,16 @@ import org.springframework.batch.core.JobParameters;
|
||||
import org.springframework.batch.core.StepExecution;
|
||||
import org.springframework.batch.item.ExecutionContext;
|
||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
import org.springframework.cloud.stream.test.binder.TestSupportBinderAutoConfiguration;
|
||||
import org.springframework.cloud.task.batch.listener.support.JobExecutionEvent;
|
||||
import org.springframework.cloud.task.batch.listener.support.JobInstanceEvent;
|
||||
import org.springframework.cloud.task.batch.listener.support.StepExecutionEvent;
|
||||
import org.springframework.cloud.task.configuration.EnableTask;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.cloud.task.configuration.SimpleTaskAutoConfiguration;
|
||||
import org.springframework.cloud.task.configuration.SingleTaskConfiguration;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.Ordered;
|
||||
|
||||
@@ -275,12 +276,15 @@ public class JobExecutionEventTests {
|
||||
|
||||
@Test
|
||||
public void testOrderConfiguration() {
|
||||
ConfigurableApplicationContext applicationContext =
|
||||
SpringApplication.run(new Class[]{BatchEventAutoConfiguration.JobExecutionListenerConfiguration.class,
|
||||
EventJobExecutionConfiguration.class,
|
||||
PropertyPlaceholderAutoConfiguration.class,
|
||||
TestSupportBinderAutoConfiguration.class},
|
||||
new String[]{"--spring.cloud.task.closecontext_enabled=false",
|
||||
ApplicationContextRunner applicationContextRunner = new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations.of(
|
||||
EventJobExecutionConfiguration.class,
|
||||
PropertyPlaceholderAutoConfiguration.class,
|
||||
TestSupportBinderAutoConfiguration.class,
|
||||
SimpleTaskAutoConfiguration.class,
|
||||
SingleTaskConfiguration.class))
|
||||
.withUserConfiguration(BatchEventAutoConfiguration.JobExecutionListenerConfiguration.class)
|
||||
.withPropertyValues("--spring.cloud.task.closecontext_enabled=false",
|
||||
"--spring.main.web-environment=false",
|
||||
"--spring.cloud.task.batch.events.chunk-order=5",
|
||||
"--spring.cloud.task.batch.events.item-process-order=5",
|
||||
@@ -288,30 +292,35 @@ public class JobExecutionEventTests {
|
||||
"--spring.cloud.task.batch.events.item-write-order=5",
|
||||
"--spring.cloud.task.batch.events.job-execution-order=5",
|
||||
"--spring.cloud.task.batch.events.skip-order=5",
|
||||
"--spring.cloud.task.batch.events.step-execution-order=5"
|
||||
});
|
||||
"--spring.cloud.task.batch.events.step-execution-order=5");
|
||||
applicationContextRunner.run((context) -> {
|
||||
for (String beanName : LISTENER_BEAN_NAMES) {
|
||||
Ordered ordered = (Ordered)applicationContext.getBean(beanName);
|
||||
Ordered ordered = (Ordered)context.getBean(beanName);
|
||||
assertEquals("Expected order value of 5 for " + beanName,ordered.getOrder(),5);
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
private void testDisabledConfiguration(String property, String disabledListener) {
|
||||
boolean exceptionThrown = false;
|
||||
String disabledPropertyArg = (property != null) ? "--" + property + "=false" : "";
|
||||
ConfigurableApplicationContext applicationContext =
|
||||
SpringApplication.run(new Class[]{BatchEventAutoConfiguration.JobExecutionListenerConfiguration.class,
|
||||
ApplicationContextRunner applicationContextRunner = new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations.of(
|
||||
EventJobExecutionConfiguration.class,
|
||||
PropertyPlaceholderAutoConfiguration.class,
|
||||
TestSupportBinderAutoConfiguration.class},
|
||||
new String[]{"--spring.cloud.task.closecontext_enabled=false",
|
||||
"--spring.main.web-environment=false",
|
||||
disabledPropertyArg});
|
||||
|
||||
TestSupportBinderAutoConfiguration.class,
|
||||
SimpleTaskAutoConfiguration.class,
|
||||
SingleTaskConfiguration.class))
|
||||
.withUserConfiguration(BatchEventAutoConfiguration.JobExecutionListenerConfiguration.class)
|
||||
.withPropertyValues("--spring.cloud.task.closecontext_enabled=false",
|
||||
"--spring.main.web-environment=false",
|
||||
disabledPropertyArg);
|
||||
applicationContextRunner.run((context) -> {
|
||||
boolean exceptionThrown = false;
|
||||
for (String beanName : LISTENER_BEAN_NAMES) {
|
||||
if (disabledListener != null && disabledListener.equals(beanName)) {
|
||||
try {
|
||||
applicationContext.getBean(disabledListener);
|
||||
context.getBean(disabledListener);
|
||||
}
|
||||
catch (NoSuchBeanDefinitionException nsbde) {
|
||||
exceptionThrown = true;
|
||||
@@ -319,15 +328,15 @@ public class JobExecutionEventTests {
|
||||
assertTrue(String.format("Did not expect %s bean in context", beanName), exceptionThrown);
|
||||
}
|
||||
else {
|
||||
applicationContext.getBean(beanName);
|
||||
context.getBean(beanName);
|
||||
}
|
||||
}
|
||||
applicationContext.getBean(BatchEventAutoConfiguration.BatchEventsChannels.class);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Configuration
|
||||
@EnableTask
|
||||
public static class EventJobExecutionConfiguration {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,13 +17,18 @@ package org.springframework.cloud.task.listener;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
import org.springframework.cloud.stream.config.BindingServiceConfiguration;
|
||||
import org.springframework.cloud.stream.test.binder.TestSupportBinderAutoConfiguration;
|
||||
import org.springframework.cloud.task.configuration.EnableTask;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.cloud.task.configuration.SimpleTaskAutoConfiguration;
|
||||
import org.springframework.cloud.task.configuration.SingleTaskConfiguration;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.integration.annotation.BridgeFrom;
|
||||
import org.springframework.integration.channel.NullChannel;
|
||||
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
||||
@@ -38,20 +43,31 @@ public class TaskEventTests {
|
||||
|
||||
@Test
|
||||
public void testDefaultConfiguration() {
|
||||
ConfigurableApplicationContext applicationContext =
|
||||
SpringApplication.run(new Class[]{PropertyPlaceholderAutoConfiguration.class,EmbeddedDataSourceConfiguration.class,TaskEventsConfiguration.class,
|
||||
TaskEventAutoConfiguration.class,
|
||||
TestSupportBinderAutoConfiguration.class},
|
||||
new String[]{ "--spring.cloud.task.closecontext_enabled=false",
|
||||
"--spring.main.web-environment=false"});
|
||||
|
||||
assertNotNull(applicationContext.getBean("taskEventListener"));
|
||||
assertNotNull(applicationContext.getBean(TaskEventAutoConfiguration.TaskEventChannels.class));
|
||||
ApplicationContextRunner applicationContextRunner = new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations.of(EmbeddedDataSourceConfiguration.class,
|
||||
TaskEventAutoConfiguration.class,
|
||||
PropertyPlaceholderAutoConfiguration.class,
|
||||
TestSupportBinderAutoConfiguration.class,
|
||||
SimpleTaskAutoConfiguration.class,
|
||||
SingleTaskConfiguration.class,
|
||||
BindingServiceConfiguration.class))
|
||||
.withUserConfiguration(TaskEventsConfiguration.class)
|
||||
.withPropertyValues("spring.cloud.task.closecontext_enabled=false",
|
||||
"spring.main.web-environment=false");
|
||||
applicationContextRunner.run((context) -> {
|
||||
assertNotNull(context.getBean("taskEventListener"));
|
||||
assertNotNull(context.getBean(TaskEventAutoConfiguration.TaskEventChannels.class));
|
||||
});
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@EnableTask
|
||||
public static class TaskEventsConfiguration {
|
||||
|
||||
@Bean
|
||||
@BridgeFrom(TaskEventAutoConfiguration.TaskEventChannels.TASK_EVENTS)
|
||||
public NullChannel testEmptyChannel() {
|
||||
return new NullChannel();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user