-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This commit adds full support for MariaDB as a job repository and removes the code that treats it as MySQL. Resolves #3891 Resolves #4217
- Loading branch information
1 parent
724cc97
commit 524e956
Showing
15 changed files
with
503 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
17 changes: 17 additions & 0 deletions
17
spring-batch-core/src/main/resources/batch-mariadb.properties
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
# Placeholders batch.* | ||
# for MariaDB: | ||
batch.jdbc.driver=org.mariadb.jdbc.Driver | ||
batch.jdbc.url=jdbc:mariadb://localhost/test | ||
batch.jdbc.user=test | ||
batch.jdbc.password=test | ||
batch.database.incrementer.class=org.springframework.batch.item.database.support.MariaDBSequenceMaxValueIncrementer | ||
batch.schema.script=classpath:/org/springframework/batch/core/schema-mariadb.sql | ||
batch.drop.script=classpath:/org/springframework/batch/core/schema-drop-mariadb.sql | ||
batch.jdbc.testWhileIdle=true | ||
batch.jdbc.validationQuery= | ||
|
||
|
||
# Non-platform dependent settings that you might like to change | ||
batch.data.source.init=true | ||
batch.table.prefix=BATCH_ | ||
|
10 changes: 10 additions & 0 deletions
10
spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-mariadb.sql
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
DROP TABLE IF EXISTS BATCH_STEP_EXECUTION_CONTEXT; | ||
DROP TABLE IF EXISTS BATCH_JOB_EXECUTION_CONTEXT; | ||
DROP TABLE IF EXISTS BATCH_STEP_EXECUTION; | ||
DROP TABLE IF EXISTS BATCH_JOB_EXECUTION_PARAMS; | ||
DROP TABLE IF EXISTS BATCH_JOB_EXECUTION; | ||
DROP TABLE IF EXISTS BATCH_JOB_INSTANCE; | ||
|
||
DROP SEQUENCE IF EXISTS BATCH_STEP_EXECUTION_SEQ; | ||
DROP SEQUENCE IF EXISTS BATCH_JOB_EXECUTION_SEQ; | ||
DROP SEQUENCE IF EXISTS BATCH_JOB_SEQ; |
78 changes: 78 additions & 0 deletions
78
spring-batch-core/src/main/resources/org/springframework/batch/core/schema-mariadb.sql
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
CREATE TABLE BATCH_JOB_INSTANCE ( | ||
JOB_INSTANCE_ID BIGINT 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) | ||
) ENGINE=InnoDB; | ||
|
||
CREATE TABLE BATCH_JOB_EXECUTION ( | ||
JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , | ||
VERSION BIGINT , | ||
JOB_INSTANCE_ID BIGINT NOT NULL, | ||
CREATE_TIME DATETIME(6) NOT NULL, | ||
START_TIME DATETIME(6) DEFAULT NULL , | ||
END_TIME DATETIME(6) DEFAULT NULL , | ||
STATUS VARCHAR(10) , | ||
EXIT_CODE VARCHAR(2500) , | ||
EXIT_MESSAGE VARCHAR(2500) , | ||
LAST_UPDATED DATETIME(6), | ||
constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) | ||
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) | ||
) ENGINE=InnoDB; | ||
|
||
CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( | ||
JOB_EXECUTION_ID BIGINT NOT NULL , | ||
PARAMETER_NAME VARCHAR(100) NOT NULL , | ||
PARAMETER_TYPE VARCHAR(100) NOT NULL , | ||
PARAMETER_VALUE VARCHAR(2500) , | ||
IDENTIFYING CHAR(1) NOT NULL , | ||
constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) | ||
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) | ||
) ENGINE=InnoDB; | ||
|
||
CREATE TABLE BATCH_STEP_EXECUTION ( | ||
STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , | ||
VERSION BIGINT NOT NULL, | ||
STEP_NAME VARCHAR(100) NOT NULL, | ||
JOB_EXECUTION_ID BIGINT NOT NULL, | ||
CREATE_TIME DATETIME(6) NOT NULL, | ||
START_TIME DATETIME(6) DEFAULT NULL , | ||
END_TIME DATETIME(6) 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 DATETIME(6), | ||
constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) | ||
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) | ||
) ENGINE=InnoDB; | ||
|
||
CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( | ||
STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, | ||
SHORT_CONTEXT VARCHAR(2500) NOT NULL, | ||
SERIALIZED_CONTEXT TEXT , | ||
constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) | ||
references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) | ||
) ENGINE=InnoDB; | ||
|
||
CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( | ||
JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, | ||
SHORT_CONTEXT VARCHAR(2500) NOT NULL, | ||
SERIALIZED_CONTEXT TEXT , | ||
constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) | ||
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) | ||
) ENGINE=InnoDB; | ||
|
||
CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ START WITH 1 MINVALUE 1 MAXVALUE 9223372036854775806 INCREMENT BY 1 NOCACHE NOCYCLE ENGINE=InnoDB; | ||
CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ START WITH 1 MINVALUE 1 MAXVALUE 9223372036854775806 INCREMENT BY 1 NOCACHE NOCYCLE ENGINE=InnoDB; | ||
CREATE SEQUENCE BATCH_JOB_SEQ START WITH 1 MINVALUE 1 MAXVALUE 9223372036854775806 INCREMENT BY 1 NOCACHE NOCYCLE ENGINE=InnoDB; | ||
|
||
|
121 changes: 121 additions & 0 deletions
121
.../org/springframework/batch/core/test/repository/MariaDBJobRepositoryIntegrationTests.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
/* | ||
* Copyright 2022 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. | ||
* You may obtain a copy of the License at | ||
* | ||
* https://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
package org.springframework.batch.core.test.repository; | ||
|
||
import javax.sql.DataSource; | ||
|
||
import org.junit.jupiter.api.BeforeEach; | ||
import org.junit.jupiter.api.Test; | ||
import org.mariadb.jdbc.MariaDbDataSource; | ||
import org.testcontainers.containers.MariaDBContainer; | ||
import org.testcontainers.junit.jupiter.Container; | ||
import org.testcontainers.junit.jupiter.Testcontainers; | ||
import org.testcontainers.utility.DockerImageName; | ||
|
||
import org.springframework.batch.core.ExitStatus; | ||
import org.springframework.batch.core.Job; | ||
import org.springframework.batch.core.JobExecution; | ||
import org.springframework.batch.core.JobParameters; | ||
import org.springframework.batch.core.JobParametersBuilder; | ||
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; | ||
import org.springframework.batch.core.job.builder.JobBuilder; | ||
import org.springframework.batch.core.launch.JobLauncher; | ||
import org.springframework.batch.core.repository.JobRepository; | ||
import org.springframework.batch.core.step.builder.StepBuilder; | ||
import org.springframework.batch.repeat.RepeatStatus; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.context.annotation.Bean; | ||
import org.springframework.context.annotation.Configuration; | ||
import org.springframework.core.io.ClassPathResource; | ||
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; | ||
import org.springframework.jdbc.support.JdbcTransactionManager; | ||
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; | ||
import org.springframework.transaction.PlatformTransactionManager; | ||
|
||
import static org.junit.jupiter.api.Assertions.assertEquals; | ||
import static org.junit.jupiter.api.Assertions.assertNotNull; | ||
|
||
/** | ||
* @author Mahmoud Ben Hassine | ||
*/ | ||
@Testcontainers | ||
@SpringJUnitConfig | ||
class MariaDBJobRepositoryIntegrationTests { | ||
|
||
// TODO find the best way to externalize and manage image versions | ||
private static final DockerImageName MARIADB_IMAGE = DockerImageName.parse("mariadb:10.9.3"); | ||
|
||
@Container | ||
public static MariaDBContainer<?> mariaDBContainer = new MariaDBContainer<>(MARIADB_IMAGE); | ||
|
||
@Autowired | ||
private DataSource dataSource; | ||
|
||
@Autowired | ||
private JobLauncher jobLauncher; | ||
|
||
@Autowired | ||
private Job job; | ||
|
||
@BeforeEach | ||
void setUp() { | ||
ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(); | ||
databasePopulator.addScript(new ClassPathResource("/org/springframework/batch/core/schema-mariadb.sql")); | ||
databasePopulator.execute(this.dataSource); | ||
} | ||
|
||
@Test | ||
void testJobExecution() throws Exception { | ||
// given | ||
JobParameters jobParameters = new JobParametersBuilder().toJobParameters(); | ||
|
||
// when | ||
JobExecution jobExecution = this.jobLauncher.run(this.job, jobParameters); | ||
|
||
// then | ||
assertNotNull(jobExecution); | ||
assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus()); | ||
} | ||
|
||
@Configuration | ||
@EnableBatchProcessing | ||
static class TestConfiguration { | ||
|
||
@Bean | ||
public DataSource dataSource() throws Exception { | ||
MariaDbDataSource datasource = new MariaDbDataSource(); | ||
datasource.setUrl(mariaDBContainer.getJdbcUrl()); | ||
datasource.setUser(mariaDBContainer.getUsername()); | ||
datasource.setPassword(mariaDBContainer.getPassword()); | ||
return datasource; | ||
} | ||
|
||
@Bean | ||
public JdbcTransactionManager transactionManager(DataSource dataSource) { | ||
return new JdbcTransactionManager(dataSource); | ||
} | ||
|
||
@Bean | ||
public Job job(JobRepository jobRepository, PlatformTransactionManager transactionManager) { | ||
return new JobBuilder("job", jobRepository) | ||
.start(new StepBuilder("step", jobRepository) | ||
.tasklet((contribution, chunkContext) -> RepeatStatus.FINISHED, transactionManager).build()) | ||
.build(); | ||
} | ||
|
||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
50 changes: 50 additions & 0 deletions
50
...main/java/org/springframework/batch/item/database/support/MariaDBPagingQueryProvider.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
/* | ||
* Copyright 2022 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. | ||
* You may obtain a copy of the License at | ||
* | ||
* https://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
package org.springframework.batch.item.database.support; | ||
|
||
import org.springframework.batch.item.database.PagingQueryProvider; | ||
import org.springframework.util.StringUtils; | ||
|
||
/** | ||
* MariaDB implementation of a {@link PagingQueryProvider} using database specific | ||
* features. | ||
* | ||
* @author Mahmoud Ben Hassine | ||
* @since 5.0 | ||
*/ | ||
public class MariaDBPagingQueryProvider extends AbstractSqlPagingQueryProvider { | ||
|
||
@Override | ||
public String generateFirstPageQuery(int pageSize) { | ||
return SqlPagingQueryUtils.generateLimitSqlQuery(this, false, buildLimitClause(pageSize)); | ||
} | ||
|
||
@Override | ||
public String generateRemainingPagesQuery(int pageSize) { | ||
if (StringUtils.hasText(getGroupClause())) { | ||
return SqlPagingQueryUtils.generateLimitGroupedSqlQuery(this, buildLimitClause(pageSize)); | ||
} | ||
else { | ||
return SqlPagingQueryUtils.generateLimitSqlQuery(this, true, buildLimitClause(pageSize)); | ||
} | ||
} | ||
|
||
private String buildLimitClause(int pageSize) { | ||
return new StringBuilder().append("LIMIT ").append(pageSize).toString(); | ||
} | ||
|
||
} |
45 changes: 45 additions & 0 deletions
45
...a/org/springframework/batch/item/database/support/MariaDBSequenceMaxValueIncrementer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
/* | ||
* Copyright 2022 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. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
package org.springframework.batch.item.database.support; | ||
|
||
import javax.sql.DataSource; | ||
|
||
import org.springframework.jdbc.support.incrementer.AbstractSequenceMaxValueIncrementer; | ||
import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer; | ||
|
||
/** | ||
* {@link DataFieldMaxValueIncrementer} for MariaDB. | ||
* | ||
* @author Mahmoud Ben Hassine | ||
* @since 5.0 | ||
*/ | ||
// TODO replace this with the one from Spring Framework when available | ||
public class MariaDBSequenceMaxValueIncrementer extends AbstractSequenceMaxValueIncrementer { | ||
|
||
public MariaDBSequenceMaxValueIncrementer() { | ||
} | ||
|
||
public MariaDBSequenceMaxValueIncrementer(DataSource dataSource, String incrementerName) { | ||
super(dataSource, incrementerName); | ||
} | ||
|
||
@Override | ||
protected String getSequenceQuery() { | ||
return "select next value for " + this.getIncrementerName(); | ||
} | ||
|
||
} |
Oops, something went wrong.