Add option to provide a custom JobKeyGenerator in JdbcJobInstanceDao

Resolves #3926
This commit is contained in:
Robert McNees
2023-04-03 14:42:30 -04:00
committed by Mahmoud Ben Hassine
parent 2c97974366
commit e36a44788d
12 changed files with 349 additions and 3 deletions

View File

@@ -113,6 +113,11 @@ class BatchRegistrar implements ImportBeanDefinitionRegistrar {
beanDefinitionBuilder.addPropertyReference("incrementerFactory", incrementerFactoryRef);
}
String jobKeyGeneratorRef = batchAnnotation.jobKeyGeneratorRef();
if (registry.containsBeanDefinition(jobKeyGeneratorRef)) {
beanDefinitionBuilder.addPropertyReference("jobKeyGenerator", jobKeyGeneratorRef);
}
String charset = batchAnnotation.charset();
if (charset != null) {
beanDefinitionBuilder.addPropertyValue("charset", Charset.forName(charset));
@@ -165,6 +170,11 @@ class BatchRegistrar implements ImportBeanDefinitionRegistrar {
beanDefinitionBuilder.addPropertyReference("conversionService", conversionServiceRef);
}
String jobKeyGeneratorRef = batchAnnotation.jobKeyGeneratorRef();
if (registry.containsBeanDefinition(jobKeyGeneratorRef)) {
beanDefinitionBuilder.addPropertyReference("jobKeyGenerator", jobKeyGeneratorRef);
}
String charset = batchAnnotation.charset();
if (charset != null) {
beanDefinitionBuilder.addPropertyValue("charset", Charset.forName(charset));

View File

@@ -214,6 +214,15 @@ public @interface EnableBatchProcessing {
*/
String incrementerFactoryRef() default "incrementerFactory";
/**
* The generator that determines a unique key for identifying job instance objects
* @return the bean name of the job key generator to use. Defaults to
* {@literal jobKeyGenerator}.
*
* @since 5.1
*/
String jobKeyGeneratorRef() default "jobKeyGenerator";
/**
* The large object handler to use in job repository and job explorer.
* @return the bean name of the lob handler to use. Defaults to {@literal lobHandler}.

View File

@@ -21,6 +21,9 @@ import java.sql.Types;
import javax.sql.DataSource;
import org.springframework.batch.core.DefaultJobKeyGenerator;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobKeyGenerator;
import org.springframework.batch.core.configuration.BatchConfigurationException;
import org.springframework.batch.core.configuration.JobRegistry;
import org.springframework.batch.core.converter.DateToStringConverter;
@@ -129,6 +132,7 @@ public class DefaultBatchConfiguration implements ApplicationContextAware {
jobRepositoryFactoryBean.setTransactionManager(getTransactionManager());
jobRepositoryFactoryBean.setDatabaseType(getDatabaseType());
jobRepositoryFactoryBean.setIncrementerFactory(getIncrementerFactory());
jobRepositoryFactoryBean.setJobKeyGenerator(getJobKeyGenerator());
jobRepositoryFactoryBean.setClobType(getClobType());
jobRepositoryFactoryBean.setTablePrefix(getTablePrefix());
jobRepositoryFactoryBean.setSerializer(getExecutionContextSerializer());
@@ -167,6 +171,7 @@ public class DefaultBatchConfiguration implements ApplicationContextAware {
jobExplorerFactoryBean.setDataSource(getDataSource());
jobExplorerFactoryBean.setTransactionManager(getTransactionManager());
jobExplorerFactoryBean.setJdbcOperations(getJdbcOperations());
jobExplorerFactoryBean.setJobKeyGenerator(getJobKeyGenerator());
jobExplorerFactoryBean.setCharset(getCharset());
jobExplorerFactoryBean.setTablePrefix(getTablePrefix());
jobExplorerFactoryBean.setLobHandler(getLobHandler());
@@ -348,6 +353,16 @@ public class DefaultBatchConfiguration implements ApplicationContextAware {
return new DefaultDataFieldMaxValueIncrementerFactory(getDataSource());
}
/**
* A custom implementation of the {@link JobKeyGenerator}. The default, if not
* injected, is the {@link DefaultJobKeyGenerator}.
* @return the generator that creates the key used in identifying {@link JobInstance}
* objects
*/
protected JobKeyGenerator getJobKeyGenerator() {
return new DefaultJobKeyGenerator();
}
/**
* Return the database type. The default will be introspected from the JDBC meta-data
* of the data source.

View File

@@ -21,6 +21,8 @@ import java.nio.charset.StandardCharsets;
import javax.sql.DataSource;
import org.springframework.batch.core.DefaultJobKeyGenerator;
import org.springframework.batch.core.JobKeyGenerator;
import org.springframework.batch.core.converter.DateToStringConverter;
import org.springframework.batch.core.converter.LocalDateTimeToStringConverter;
import org.springframework.batch.core.converter.LocalDateToStringConverter;
@@ -77,6 +79,8 @@ public class JobExplorerFactoryBean extends AbstractJobExplorerFactoryBean imple
}
};
private JobKeyGenerator jobKeyGenerator;
private LobHandler lobHandler;
private ExecutionContextSerializer serializer;
@@ -124,6 +128,16 @@ public class JobExplorerFactoryBean extends AbstractJobExplorerFactoryBean imple
this.tablePrefix = tablePrefix;
}
/**
* * Sets the generator for creating the key used in identifying unique {link
* JobInstance} objects
* @param jobKeyGenerator a {@link JobKeyGenerator}
* @since 5.1
*/
public void setJobKeyGenerator(JobKeyGenerator jobKeyGenerator) {
this.jobKeyGenerator = jobKeyGenerator;
}
/**
* The lob handler to use when saving {@link ExecutionContext} instances. Defaults to
* {@code null}, which works for most databases.
@@ -166,6 +180,10 @@ public class JobExplorerFactoryBean extends AbstractJobExplorerFactoryBean imple
jdbcOperations = new JdbcTemplate(dataSource);
}
if (jobKeyGenerator == null) {
jobKeyGenerator = new DefaultJobKeyGenerator();
}
if (serializer == null) {
serializer = new DefaultExecutionContextSerializer();
}
@@ -203,6 +221,7 @@ public class JobExplorerFactoryBean extends AbstractJobExplorerFactoryBean imple
JdbcJobInstanceDao dao = new JdbcJobInstanceDao();
dao.setJdbcTemplate(jdbcOperations);
dao.setJobInstanceIncrementer(incrementer);
dao.setJobKeyGenerator(jobKeyGenerator);
dao.setTablePrefix(tablePrefix);
dao.afterPropertiesSet();
return dao;

View File

@@ -129,7 +129,7 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements
private DataFieldMaxValueIncrementer jobInstanceIncrementer;
private final JobKeyGenerator<JobParameters> jobKeyGenerator = new DefaultJobKeyGenerator();
private JobKeyGenerator<JobParameters> jobKeyGenerator = new DefaultJobKeyGenerator();
/**
* In this JDBC implementation a job instance id is obtained by asking the
@@ -341,6 +341,18 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements
this.jobInstanceIncrementer = jobInstanceIncrementer;
}
/**
* Setter for {@link JobKeyGenerator} to be used when generating unique identifiers
* for {@link JobInstance} objects.
* @param jobKeyGenerator the {@link JobKeyGenerator}
*
* @since 5.1
*/
public void setJobKeyGenerator(JobKeyGenerator jobKeyGenerator) {
Assert.notNull(jobKeyGenerator, "jobKeyGenerator must not be null.");
this.jobKeyGenerator = jobKeyGenerator;
}
@Override
public void afterPropertiesSet() throws Exception {
super.afterPropertiesSet();

View File

@@ -26,6 +26,8 @@ import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.core.DefaultJobKeyGenerator;
import org.springframework.batch.core.JobKeyGenerator;
import org.springframework.batch.core.converter.DateToStringConverter;
import org.springframework.batch.core.converter.LocalDateTimeToStringConverter;
import org.springframework.batch.core.converter.LocalDateToStringConverter;
@@ -87,6 +89,8 @@ public class JobRepositoryFactoryBean extends AbstractJobRepositoryFactoryBean i
private DataFieldMaxValueIncrementerFactory incrementerFactory;
private JobKeyGenerator jobKeyGenerator;
private int maxVarCharLength = AbstractJdbcBatchMetadataDao.DEFAULT_EXIT_MESSAGE_LENGTH;
private LobHandler lobHandler;
@@ -182,6 +186,16 @@ public class JobRepositoryFactoryBean extends AbstractJobRepositoryFactoryBean i
this.incrementerFactory = incrementerFactory;
}
/**
* * Sets the generator for creating the key used in identifying unique {link
* JobInstance} objects
* @param jobKeyGenerator a {@link JobKeyGenerator}
* @since 5.1
*/
public void setJobKeyGenerator(JobKeyGenerator jobKeyGenerator) {
this.jobKeyGenerator = jobKeyGenerator;
}
/**
* Set the {@link Charset} to use when serializing/deserializing the execution
* context. Defaults to "UTF-8". Must not be {@code null}.
@@ -218,6 +232,10 @@ public class JobRepositoryFactoryBean extends AbstractJobRepositoryFactoryBean i
incrementerFactory = new DefaultDataFieldMaxValueIncrementerFactory(dataSource);
}
if (jobKeyGenerator == null) {
jobKeyGenerator = new DefaultJobKeyGenerator();
}
if (databaseType == null) {
databaseType = DatabaseType.fromMetaData(dataSource).name();
if (logger.isInfoEnabled()) {
@@ -262,6 +280,7 @@ public class JobRepositoryFactoryBean extends AbstractJobRepositoryFactoryBean i
JdbcJobInstanceDao dao = new JdbcJobInstanceDao();
dao.setJdbcTemplate(jdbcOperations);
dao.setJobInstanceIncrementer(incrementerFactory.getIncrementer(databaseType, tablePrefix + "JOB_SEQ"));
dao.setJobKeyGenerator(jobKeyGenerator);
dao.setTablePrefix(tablePrefix);
dao.afterPropertiesSet();
return dao;