From 1185421803055ce9c9327ac755ec37a2fab6c267 Mon Sep 17 00:00:00 2001 From: Glenn Renfro Date: Fri, 2 Dec 2016 14:53:27 -0500 Subject: [PATCH] TaskBatchAutoConfiguration now uses datasource from TaskConfigurer resovles #252 --- .../TaskBatchAutoConfiguration.java | 21 ++++++++++++------- .../TaskBatchExecutionListenerTests.java | 6 +----- .../configuration/DefaultTaskConfigurer.java | 9 ++++++++ .../SimpleTaskConfiguration.java | 8 +++++-- .../task/configuration/TaskConfigurer.java | 9 ++++++++ 5 files changed, 39 insertions(+), 14 deletions(-) diff --git a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskBatchAutoConfiguration.java b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskBatchAutoConfiguration.java index 87e8a8d8..12047a43 100644 --- a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskBatchAutoConfiguration.java +++ b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskBatchAutoConfiguration.java @@ -25,7 +25,9 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.task.batch.listener.TaskBatchExecutionListener; +import org.springframework.cloud.task.configuration.TaskConfigurer; import org.springframework.cloud.task.repository.TaskExplorer; +import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.util.CollectionUtils; @@ -50,20 +52,25 @@ public class TaskBatchAutoConfiguration { @ConditionalOnMissingBean(name = "taskBatchExecutionListener") public static class TaskBatchExecutionListenerAutoconfiguration { - @Autowired(required = false) - private Collection dataSources; + @Autowired + private ApplicationContext context; @Bean public TaskBatchExecutionListenerFactoryBean taskBatchExecutionListener(TaskExplorer taskExplorer) { - if(!CollectionUtils.isEmpty(dataSources) && dataSources.size() == 1) { - return new TaskBatchExecutionListenerFactoryBean(dataSources.iterator().next(), taskExplorer); + + TaskConfigurer taskConfigurer = null; + if(!context.getBeansOfType(TaskConfigurer.class).isEmpty()) { + taskConfigurer = context.getBean(TaskConfigurer.class); } - else if(CollectionUtils.isEmpty(dataSources)) { - return new TaskBatchExecutionListenerFactoryBean(null, taskExplorer); + if(taskConfigurer != null && taskConfigurer.getTaskDataSource() != null) { + return new TaskBatchExecutionListenerFactoryBean( + taskConfigurer.getTaskDataSource(), + taskExplorer); } else { - throw new IllegalStateException("Expected one datasource and found " + dataSources.size()); + return new TaskBatchExecutionListenerFactoryBean(null, taskExplorer); } } + } } diff --git a/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/listener/TaskBatchExecutionListenerTests.java b/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/listener/TaskBatchExecutionListenerTests.java index bd54f40c..44a93b74 100644 --- a/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/listener/TaskBatchExecutionListenerTests.java +++ b/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/listener/TaskBatchExecutionListenerTests.java @@ -288,11 +288,7 @@ public class TaskBatchExecutionListenerTests { .setName("incorrectDataSource"); return builder.build(); } - - @Bean - public TaskBatchExecutionListenerFactoryBean taskBatchExecutionListener(TaskExplorer taskExplorer) { - return new TaskBatchExecutionListenerFactoryBean(myDataSource(), taskExplorer); - } + @Bean public TaskConfigurer taskConfigurer() { diff --git a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/DefaultTaskConfigurer.java b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/DefaultTaskConfigurer.java index 1fad9f5f..9f5128bc 100644 --- a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/DefaultTaskConfigurer.java +++ b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/DefaultTaskConfigurer.java @@ -54,6 +54,10 @@ public class DefaultTaskConfigurer implements TaskConfigurer { private DataSource dataSource; + public DefaultTaskConfigurer() { + this(null); + } + /** * @param dataSource references the {@link DataSource} to be used as the Task * repository. If none is provided, a Map will be used (not recommended for @@ -83,6 +87,11 @@ public class DefaultTaskConfigurer implements TaskConfigurer { return this.taskExplorer; } + @Override + public DataSource getTaskDataSource() { + return this.dataSource; + } + @Override public PlatformTransactionManager getTransactionManager() { if(this.transactionManager == null) { diff --git a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/SimpleTaskConfiguration.java b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/SimpleTaskConfiguration.java index 5005c6d5..01976b4a 100644 --- a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/SimpleTaskConfiguration.java +++ b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/SimpleTaskConfiguration.java @@ -153,12 +153,16 @@ public class SimpleTaskConfiguration { int configurers = this.context.getBeanNamesForType(TaskConfigurer.class).length; if (configurers < 1) { + TaskConfigurer taskConfigurer; if(!CollectionUtils.isEmpty(this.dataSources) && this.dataSources.size() == 1) { - return new DefaultTaskConfigurer(this.dataSources.iterator().next()); + taskConfigurer = new DefaultTaskConfigurer(this.dataSources.iterator().next()); + } else { - return new DefaultTaskConfigurer(null); + taskConfigurer = new DefaultTaskConfigurer(); } + this.context.getBeanFactory().registerSingleton("taskConfigurer", taskConfigurer); + return taskConfigurer; } else { if(configurers == 1) { diff --git a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/TaskConfigurer.java b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/TaskConfigurer.java index 58493897..38a845f8 100644 --- a/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/TaskConfigurer.java +++ b/spring-cloud-task-core/src/main/java/org/springframework/cloud/task/configuration/TaskConfigurer.java @@ -16,6 +16,8 @@ package org.springframework.cloud.task.configuration; +import javax.sql.DataSource; + import org.springframework.cloud.task.repository.TaskExplorer; import org.springframework.cloud.task.repository.TaskRepository; import org.springframework.transaction.PlatformTransactionManager; @@ -49,4 +51,11 @@ public interface TaskConfigurer { * @return a TaskExplorer */ TaskExplorer getTaskExplorer(); + + /** + * Retrieves the DataSource that will be used for task operations. If a + * DataSource is not being used for the implemented TaskConfigurer this + * method will return null. + */ + DataSource getTaskDataSource(); }