From d093807f95d6362e88a2655f738acd6310ee4ec6 Mon Sep 17 00:00:00 2001 From: Mukul Chaundhyan Date: Tue, 9 Feb 2021 10:30:51 +0530 Subject: [PATCH] Group jdbc-related batch properties beneath spring.batch.jdbc See gh-25316 --- .../batch/BasicBatchConfigurer.java | 5 +- .../batch/BatchAutoConfiguration.java | 5 +- .../batch/BatchDataSourceInitializer.java | 15 +-- .../autoconfigure/batch/BatchProperties.java | 93 ++++++++++++++----- .../batch/BatchAutoConfigurationTests.java | 36 +++++++ ...BatchAutoConfigurationWithoutJpaTests.java | 15 +++ .../JobLauncherApplicationRunnerTests.java | 2 +- 7 files changed, 136 insertions(+), 35 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BasicBatchConfigurer.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BasicBatchConfigurer.java index c86f638939..4dd4c2b434 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BasicBatchConfigurer.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BasicBatchConfigurer.java @@ -38,6 +38,7 @@ import org.springframework.transaction.PlatformTransactionManager; * @author Andy Wilkinson * @author Kazuki Shimizu * @author Stephane Nicoll + * @author Mukul Kumar Chaundhyan * @since 1.0.0 */ public class BasicBatchConfigurer implements BatchConfigurer, InitializingBean { @@ -111,7 +112,7 @@ public class BasicBatchConfigurer implements BatchConfigurer, InitializingBean { PropertyMapper map = PropertyMapper.get(); JobExplorerFactoryBean factory = new JobExplorerFactoryBean(); factory.setDataSource(this.dataSource); - map.from(this.properties::getTablePrefix).whenHasText().to(factory::setTablePrefix); + map.from(this.properties.getJdbc()::getTablePrefix).whenHasText().to(factory::setTablePrefix); factory.afterPropertiesSet(); return factory.getObject(); } @@ -128,7 +129,7 @@ public class BasicBatchConfigurer implements BatchConfigurer, InitializingBean { PropertyMapper map = PropertyMapper.get(); map.from(this.dataSource).to(factory::setDataSource); map.from(this::determineIsolationLevel).whenNonNull().to(factory::setIsolationLevelForCreate); - map.from(this.properties::getTablePrefix).whenHasText().to(factory::setTablePrefix); + map.from(this.properties.getJdbc()::getTablePrefix).whenHasText().to(factory::setTablePrefix); map.from(this::getTransactionManager).to(factory::setTransactionManager); factory.afterPropertiesSet(); return factory.getObject(); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java index e0ca77d818..3953b5424b 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java @@ -57,6 +57,7 @@ import org.springframework.util.StringUtils; * @author Eddú Meléndez * @author Kazuki Shimizu * @author Mahmoud Ben Hassine + * @author Mukul Kumar Chaundhyan * @since 1.0.0 */ @Configuration(proxyBeanMethods = false) @@ -107,11 +108,13 @@ public class BatchAutoConfiguration { @Bean @ConditionalOnMissingBean + @ConditionalOnProperty(prefix = "spring.batch.jdbc", name = "enabled", havingValue = "true", + matchIfMissing = true) BatchDataSourceInitializer batchDataSourceInitializer(DataSource dataSource, @BatchDataSource ObjectProvider batchDataSource, ResourceLoader resourceLoader, BatchProperties properties) { return new BatchDataSourceInitializer(batchDataSource.getIfAvailable(() -> dataSource), resourceLoader, - properties); + properties.getJdbc()); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchDataSourceInitializer.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchDataSourceInitializer.java index 4abf9de4a0..6cd9c9162b 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchDataSourceInitializer.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchDataSourceInitializer.java @@ -18,6 +18,7 @@ package org.springframework.boot.autoconfigure.batch; import javax.sql.DataSource; +import org.springframework.boot.autoconfigure.batch.BatchProperties.Jdbc; import org.springframework.boot.jdbc.AbstractDataSourceInitializer; import org.springframework.boot.jdbc.DataSourceInitializationMode; import org.springframework.core.io.ResourceLoader; @@ -28,27 +29,27 @@ import org.springframework.util.Assert; * * @author Dave Syer * @author Vedran Pavic + * @author Mukul Kumar Chaundhyan * @since 1.0.0 */ public class BatchDataSourceInitializer extends AbstractDataSourceInitializer { - private final BatchProperties properties; + private final Jdbc jdbcProperties; - public BatchDataSourceInitializer(DataSource dataSource, ResourceLoader resourceLoader, - BatchProperties properties) { + public BatchDataSourceInitializer(DataSource dataSource, ResourceLoader resourceLoader, Jdbc jdbcProperties) { super(dataSource, resourceLoader); - Assert.notNull(properties, "BatchProperties must not be null"); - this.properties = properties; + Assert.notNull(jdbcProperties, "Jdbc Batch Properties must not be null"); + this.jdbcProperties = jdbcProperties; } @Override protected DataSourceInitializationMode getMode() { - return this.properties.getInitializeSchema(); + return this.jdbcProperties.getInitializeSchema(); } @Override protected String getSchemaLocation() { - return this.properties.getSchema(); + return this.jdbcProperties.getSchema(); } @Override diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchProperties.java index d1bdbc0cba..cf78a26cb1 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchProperties.java @@ -17,6 +17,7 @@ package org.springframework.boot.autoconfigure.batch; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.DeprecatedConfigurationProperty; import org.springframework.boot.jdbc.DataSourceInitializationMode; /** @@ -25,59 +26,51 @@ import org.springframework.boot.jdbc.DataSourceInitializationMode; * @author Stephane Nicoll * @author Eddú Meléndez * @author Vedran Pavic + * @author Mukul Kumar Chaundhyan * @since 1.2.0 */ @ConfigurationProperties(prefix = "spring.batch") public class BatchProperties { - private static final String DEFAULT_SCHEMA_LOCATION = "classpath:org/springframework/" - + "batch/core/schema-@@platform@@.sql"; - - /** - * Path to the SQL file to use to initialize the database schema. - */ - private String schema = DEFAULT_SCHEMA_LOCATION; - - /** - * Table prefix for all the batch meta-data tables. - */ - private String tablePrefix; - - /** - * Database schema initialization mode. - */ - private DataSourceInitializationMode initializeSchema = DataSourceInitializationMode.EMBEDDED; - private final Job job = new Job(); + private final Jdbc jdbc = new Jdbc(); + + @DeprecatedConfigurationProperty(replacement = "spring.batch.jdbc") public String getSchema() { - return this.schema; + return this.jdbc.getSchema(); } public void setSchema(String schema) { - this.schema = schema; + this.jdbc.setSchema(schema); } + @DeprecatedConfigurationProperty(replacement = "spring.batch.jdbc") public String getTablePrefix() { - return this.tablePrefix; + return this.jdbc.getTablePrefix(); } public void setTablePrefix(String tablePrefix) { - this.tablePrefix = tablePrefix; + this.jdbc.setTablePrefix(tablePrefix); } + @DeprecatedConfigurationProperty(replacement = "spring.batch.jdbc") public DataSourceInitializationMode getInitializeSchema() { - return this.initializeSchema; + return this.jdbc.getInitializeSchema(); } public void setInitializeSchema(DataSourceInitializationMode initializeSchema) { - this.initializeSchema = initializeSchema; + this.jdbc.setInitializeSchema(initializeSchema); } public Job getJob() { return this.job; } + public Jdbc getJdbc() { + return this.jdbc; + } + public static class Job { /** @@ -96,4 +89,56 @@ public class BatchProperties { } + /** + * JDBC configuration properties for Spring Batch. + * + * @author Mukul Kumar Chaundhyan + * @since 2.5.0 + */ + public static class Jdbc { + + private static final String DEFAULT_SCHEMA_LOCATION = "classpath:org/springframework/" + + "batch/core/schema-@@platform@@.sql"; + + /** + * Path to the SQL file to use to initialize the database schema. + */ + private String schema = DEFAULT_SCHEMA_LOCATION; + + /** + * Table prefix for all the batch meta-data tables. + */ + private String tablePrefix; + + /** + * Database schema initialization mode. + */ + private DataSourceInitializationMode initializeSchema = DataSourceInitializationMode.EMBEDDED; + + public String getSchema() { + return this.schema; + } + + public void setSchema(String schema) { + this.schema = schema; + } + + public String getTablePrefix() { + return this.tablePrefix; + } + + public void setTablePrefix(String tablePrefix) { + this.tablePrefix = tablePrefix; + } + + public DataSourceInitializationMode getInitializeSchema() { + return this.initializeSchema; + } + + public void setInitializeSchema(DataSourceInitializationMode initializeSchema) { + this.initializeSchema = initializeSchema; + } + + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java index a00dfca3d0..4898a3b04e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java @@ -187,6 +187,21 @@ class BatchAutoConfigurationTests { }); } + @Test + void testDisableSchemaLoaderWithNewJdbcProperties() { + this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.datasource.generate-unique-name=true", + "spring.batch.jdbc.initialize-schema:never") + .run((context) -> { + assertThat(context).hasSingleBean(JobLauncher.class); + assertThat(context.getBean(BatchProperties.class).getInitializeSchema()) + .isEqualTo(DataSourceInitializationMode.NEVER); + assertThatExceptionOfType(BadSqlGrammarException.class) + .isThrownBy(() -> new JdbcTemplate(context.getBean(DataSource.class)) + .queryForList("select * from BATCH_JOB_EXECUTION")); + }); + } + @Test void testUsingJpa() { this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class, @@ -224,6 +239,27 @@ class BatchAutoConfigurationTests { }); } + @Test + void testRenamePrefixWithNewJdbcProperties() { + this.contextRunner + .withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class, + HibernateJpaAutoConfiguration.class) + .withPropertyValues("spring.datasource.generate-unique-name=true", + "spring.batch.jdbc.schema:classpath:batch/custom-schema-hsql.sql", + "spring.batch.jdbc.tablePrefix:PREFIX_") + .run((context) -> { + assertThat(context).hasSingleBean(JobLauncher.class); + assertThat(context.getBean(BatchProperties.class).getInitializeSchema()) + .isEqualTo(DataSourceInitializationMode.EMBEDDED); + assertThat(new JdbcTemplate(context.getBean(DataSource.class)) + .queryForList("select * from PREFIX_JOB_EXECUTION")).isEmpty(); + JobExplorer jobExplorer = context.getBean(JobExplorer.class); + assertThat(jobExplorer.findRunningJobExecutions("test")).isEmpty(); + JobRepository jobRepository = context.getBean(JobRepository.class); + assertThat(jobRepository.getLastJobExecution("test", new JobParameters())).isNull(); + }); + } + @Test void testCustomizeJpaTransactionManagerUsingProperties() { this.contextRunner diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationWithoutJpaTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationWithoutJpaTests.java index 218660dfc4..6b7e515cd8 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationWithoutJpaTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationWithoutJpaTests.java @@ -84,6 +84,21 @@ class BatchAutoConfigurationWithoutJpaTests { }); } + @Test + void jdbcWithCustomPrefixWithNewJdbcProperties() { + this.contextRunner.withUserConfiguration(DefaultConfiguration.class, EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.datasource.generate-unique-name=true", + "spring.batch.jdbc.schema:classpath:batch/custom-schema-hsql.sql", + "spring.batch.jdbc.tablePrefix:PREFIX_") + .run((context) -> { + assertThat(new JdbcTemplate(context.getBean(DataSource.class)) + .queryForList("select * from PREFIX_JOB_EXECUTION")).isEmpty(); + assertThat(context.getBean(JobExplorer.class).findRunningJobExecutions("test")).isEmpty(); + assertThat(context.getBean(JobRepository.class).getLastJobExecution("test", new JobParameters())) + .isNull(); + }); + } + @EnableBatchProcessing @TestAutoConfigurationPackage(City.class) static class DefaultConfiguration { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/JobLauncherApplicationRunnerTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/JobLauncherApplicationRunnerTests.java index bd93b9a05b..2d3488e3b2 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/JobLauncherApplicationRunnerTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/JobLauncherApplicationRunnerTests.java @@ -228,7 +228,7 @@ class JobLauncherApplicationRunnerTests { @Bean BatchDataSourceInitializer batchDataSourceInitializer(ResourceLoader resourceLoader) { - return new BatchDataSourceInitializer(this.dataSource, resourceLoader, new BatchProperties()); + return new BatchDataSourceInitializer(this.dataSource, resourceLoader, new BatchProperties().getJdbc()); } }