diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BasicBatchConfigurer.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BasicBatchConfigurer.java index 6622eb5719..54863621f0 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BasicBatchConfigurer.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BasicBatchConfigurer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2015 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. @@ -33,6 +33,7 @@ import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.stereotype.Component; import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.util.StringUtils; /** * Basic {@link BatchConfigurer} implementation. @@ -41,10 +42,12 @@ import org.springframework.transaction.PlatformTransactionManager; * @author Andy Wilkinson */ @Component -public class BasicBatchConfigurer implements BatchConfigurer { +class BasicBatchConfigurer implements BatchConfigurer { private static Log logger = LogFactory.getLog(BasicBatchConfigurer.class); + private final BatchProperties properties; + private final DataSource dataSource; private final EntityManagerFactory entityManagerFactory; @@ -61,8 +64,8 @@ public class BasicBatchConfigurer implements BatchConfigurer { * Create a new {@link BasicBatchConfigurer} instance. * @param dataSource the underlying data source */ - public BasicBatchConfigurer(DataSource dataSource) { - this(dataSource, null); + public BasicBatchConfigurer(BatchProperties properties, DataSource dataSource) { + this(properties, dataSource, null); } /** @@ -70,8 +73,9 @@ public class BasicBatchConfigurer implements BatchConfigurer { * @param dataSource the underlying data source * @param entityManagerFactory the entity manager factory (or {@code null}) */ - public BasicBatchConfigurer(DataSource dataSource, + public BasicBatchConfigurer(BatchProperties properties, DataSource dataSource, EntityManagerFactory entityManagerFactory) { + this.properties = properties; this.entityManagerFactory = entityManagerFactory; this.dataSource = dataSource; } @@ -112,6 +116,10 @@ public class BasicBatchConfigurer implements BatchConfigurer { private JobExplorer createJobExplorer() throws Exception { JobExplorerFactoryBean jobExplorerFactoryBean = new JobExplorerFactoryBean(); jobExplorerFactoryBean.setDataSource(this.dataSource); + String tablePrefix = this.properties.getTablePrefix(); + if (StringUtils.hasText(tablePrefix)) { + jobExplorerFactoryBean.setTablePrefix(tablePrefix); + } jobExplorerFactoryBean.afterPropertiesSet(); return jobExplorerFactoryBean.getObject(); } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java index 5dc30d5d3b..6760a5185f 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2015 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. @@ -55,6 +55,7 @@ import org.springframework.util.StringUtils; * JobRegistry. * * @author Dave Syer + * @author Eddú Meléndez */ @Configuration @ConditionalOnClass({ JobLauncher.class, DataSource.class, JdbcOperations.class }) @@ -102,6 +103,10 @@ public class BatchAutoConfiguration { public JobExplorer jobExplorer(DataSource dataSource) throws Exception { JobExplorerFactoryBean factory = new JobExplorerFactoryBean(); factory.setDataSource(dataSource); + String tablePrefix = this.properties.getTablePrefix(); + if (StringUtils.hasText(tablePrefix)) { + factory.setTablePrefix(tablePrefix); + } factory.afterPropertiesSet(); return factory.getObject(); } @@ -126,6 +131,9 @@ public class BatchAutoConfiguration { @Configuration protected static class JpaBatchConfiguration { + @Autowired + private BatchProperties properties; + // The EntityManagerFactory may not be discoverable by type when this condition // is evaluated, so we need a well-known bean name. This is the one used by Spring // Boot in the JPA auto configuration. @@ -133,13 +141,13 @@ public class BatchAutoConfiguration { @ConditionalOnBean(name = "entityManagerFactory") public BatchConfigurer jpaBatchConfigurer(DataSource dataSource, EntityManagerFactory entityManagerFactory) { - return new BasicBatchConfigurer(dataSource, entityManagerFactory); + return new BasicBatchConfigurer(this.properties, dataSource, entityManagerFactory); } @Bean @ConditionalOnMissingBean(name = "entityManagerFactory") public BatchConfigurer basicBatchConfigurer(DataSource dataSource) { - return new BasicBatchConfigurer(dataSource); + return new BasicBatchConfigurer(this.properties, dataSource); } } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchProperties.java index 65f8aa7054..0da9917e36 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2015 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. @@ -22,6 +22,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; * Configuration properties for Spring Batch. * * @author Stephane Nicoll + * @author Eddú Meléndez * @since 1.2.0 */ @ConfigurationProperties("spring.batch") @@ -35,6 +36,11 @@ public class BatchProperties { */ private String schema = DEFAULT_SCHEMA_LOCATION; + /** + * Table prefix for all the batch meta-data tables. + */ + private String tablePrefix; + private final Initializer initializer = new Initializer(); private final Job job = new Job(); @@ -55,6 +61,14 @@ public class BatchProperties { return this.job; } + public void setTablePrefix(String tablePrefix) { + this.tablePrefix = tablePrefix; + } + + public String getTablePrefix() { + return this.tablePrefix; + } + public static class Initializer { /** diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java index 02c8e92eb2..04982072fc 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2015 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. @@ -211,6 +211,24 @@ public class BatchAutoConfigurationTests { new JobParameters())); } + @Test + public void testRenamePrefix() throws Exception { + this.context = new AnnotationConfigApplicationContext(); + EnvironmentTestUtils.addEnvironment(this.context, + "spring.datasource.name:batchtest", + "spring.batch.schema:classpath:batch/custom-schema-hsql.sql", + "spring.batch.tablePrefix:PREFIX_"); + this.context.register(TestConfiguration.class, + EmbeddedDataSourceConfiguration.class, + HibernateJpaAutoConfiguration.class, BatchAutoConfiguration.class, + PropertyPlaceholderAutoConfiguration.class); + this.context.refresh(); + assertNotNull(this.context.getBean(JobLauncher.class)); + assertNotNull(this.context.getBean(JobExplorer.class)); + assertEquals(0, new JdbcTemplate(this.context.getBean(DataSource.class)) + .queryForList("select * from PREFIX_JOB_EXECUTION").size()); + } + @Configuration protected static class EmptyConfiguration { } diff --git a/spring-boot-autoconfigure/src/test/resources/batch/custom-schema-hsql.sql b/spring-boot-autoconfigure/src/test/resources/batch/custom-schema-hsql.sql new file mode 100644 index 0000000000..4ce9dc78ab --- /dev/null +++ b/spring-boot-autoconfigure/src/test/resources/batch/custom-schema-hsql.sql @@ -0,0 +1,87 @@ +-- Autogenerated: do not edit this file + +CREATE TABLE PREFIX_JOB_INSTANCE ( + JOB_INSTANCE_ID BIGINT IDENTITY NOT NULL PRIMARY KEY , + VERSION BIGINT , + JOB_NAME VARCHAR(100) NOT NULL, + JOB_KEY VARCHAR(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +) ; + +CREATE TABLE PREFIX_JOB_EXECUTION ( + JOB_EXECUTION_ID BIGINT IDENTITY NOT NULL PRIMARY KEY , + VERSION BIGINT , + JOB_INSTANCE_ID BIGINT NOT NULL, + CREATE_TIME TIMESTAMP NOT NULL, + START_TIME TIMESTAMP DEFAULT NULL , + END_TIME TIMESTAMP DEFAULT NULL , + STATUS VARCHAR(10) , + EXIT_CODE VARCHAR(2500) , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED TIMESTAMP, + JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL, + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references PREFIX_JOB_INSTANCE(JOB_INSTANCE_ID) +) ; + +CREATE TABLE PREFIX_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID BIGINT NOT NULL , + TYPE_CD VARCHAR(6) NOT NULL , + KEY_NAME VARCHAR(100) NOT NULL , + STRING_VAL VARCHAR(250) , + DATE_VAL TIMESTAMP DEFAULT NULL , + LONG_VAL BIGINT , + DOUBLE_VAL DOUBLE PRECISION , + IDENTIFYING CHAR(1) NOT NULL , + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references PREFIX_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE PREFIX_STEP_EXECUTION ( + STEP_EXECUTION_ID BIGINT IDENTITY NOT NULL PRIMARY KEY , + VERSION BIGINT NOT NULL, + STEP_NAME VARCHAR(100) NOT NULL, + JOB_EXECUTION_ID BIGINT NOT NULL, + START_TIME TIMESTAMP NOT NULL , + END_TIME TIMESTAMP DEFAULT NULL , + STATUS VARCHAR(10) , + COMMIT_COUNT BIGINT , + READ_COUNT BIGINT , + FILTER_COUNT BIGINT , + WRITE_COUNT BIGINT , + READ_SKIP_COUNT BIGINT , + WRITE_SKIP_COUNT BIGINT , + PROCESS_SKIP_COUNT BIGINT , + ROLLBACK_COUNT BIGINT , + EXIT_CODE VARCHAR(2500) , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED TIMESTAMP, + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references PREFIX_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE PREFIX_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT LONGVARCHAR , + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references PREFIX_STEP_EXECUTION(STEP_EXECUTION_ID) +) ; + +CREATE TABLE PREFIX_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT LONGVARCHAR , + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references PREFIX_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE PREFIX_STEP_EXECUTION_SEQ ( + ID BIGINT IDENTITY +); +CREATE TABLE PREFIX_JOB_EXECUTION_SEQ ( + ID BIGINT IDENTITY +); +CREATE TABLE PREFIX_JOB_SEQ ( + ID BIGINT IDENTITY +); diff --git a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index 3ca7ee21d4..e6a87b3402 100644 --- a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -450,11 +450,12 @@ content into your application; rather pick only the properties that you need. spring.mail.default-encoding=UTF-8 # encoding to use for MimeMessages spring.mail.properties.*= # properties to set on the JavaMail session - # SPRING BATCH ({sc-spring-boot-autoconfigure}/batch/BatchDatabaseInitializer.{sc-ext}[BatchDatabaseInitializer]) + # SPRING BATCH ({sc-spring-boot-autoconfigure}/batch/BatchProperties.{sc-ext}[BatchProperties]) spring.batch.job.names=job1,job2 spring.batch.job.enabled=true spring.batch.initializer.enabled=true spring.batch.schema= # batch schema to load + spring.batch.table-prefix= # table prefix for all the batch meta-data tables # SPRING CACHE ({sc-spring-boot-autoconfigure}/cache/CacheProperties.{sc-ext}[CacheProperties]) spring.cache.type= # generic, ehcache, hazelcast, jcache, redis, guava, simple, none