Spring批处理:批处理的数据源和步骤的数据源
Spring Batch: datasource for Batch and datasource for step
我需要访问两个数据源:
- Spring批次仓库:内存H2
- 我的步骤需要访问
mssql
。
我在那里看到了几个关于如何创建自定义 batch configurer
的示例。
但是,有时:
implements BatchConfigurer
extends DefaultBatchConfigurer
目前我的配置文件是:
.
├── steps
│ └── MssqlBatchConfigurationStep.java
└── MainJobBatchConfiguration.java
我的步骤配置是:
@Configuration
public class MssqlBatchConfigurationStep {
private DataSource dataSource;
/**
*
* @param dataSource
*/
public MssqlBatchConfigurationStep(DataSource dataSource) {
this.dataSource = dataSource;
}
/**
*
* @return
*/
public ItemReader<Unitat> reader() {
String sql = "SELECT operation,update_time,table_name,rowid,user_login,user_name, user_ip,application_name,application_version,new_value,old_value FROM renovastorage.data_log";
JdbcCursorItemReader<Unitat> jdbcCursorItemReader = new JdbcCursorItemReader<>();
jdbcCursorItemReader.setDataSource(this.dataSource);
jdbcCursorItemReader.setSql(sql);
jdbcCursorItemReader.setVerifyCursorPosition(false);
jdbcCursorItemReader.setRowMapper(new UnitatRowMapper());
return jdbcCursorItemReader;
}
/**
*
* @return
*/
public ItemWriter<UnitatDenormalized> writer() {
// write to solr
return null;
}
}
这里的问题是,这一步是获取默认数据源。此数据源与 Spring Batch
.
获得的相同
为了解决这个问题,我想创建一个 "Batch Configurer"
来获取特定数据源而不是默认数据源。
在这里你可以看到我的工作配置:
@Configuration
@EnableBatchProcessing
// @EnableScheduling
public class MainJobBatchConfiguration {
private JobBuilderFactory jobBuilderFactory;
private StepBuilderFactory stepBuilderFactory;
private MssqlBatchConfigurationStep unitatBatchStep;
/**
*
* @param jobBuilderFactory
* @param stepBuilderFactory
*/
public MainJobBatchConfiguration(
JobBuilderFactory jobBuilderFactory,
StepBuilderFactory stepBuilderFactory,
MssqlBatchConfigurationStep unitatBatchStep
) {
this.jobBuilderFactory = jobBuilderFactory;
this.stepBuilderFactory = stepBuilderFactory;
this.unitatBatchStep = unitatBatchStep;
}
/**
*
* @return
*/
@Bean
public Step step() {
return this.stepBuilderFactory
.get("mssql")
.<Unitat, UnitatDenormalized>chunk(10)
.reader(this.unitatBatchStep.reader())
.writer(this.unitatBatchStep.writer())
.build();
}
/**
*
* @param step
* @return
*/
@Bean
public Job job(Step step) {
Job job = this.jobBuilderFactory.get("job1")
.flow(step)
.end()
.build();
return job;
}
}
My step needs to get access to a mssql.
In order to solve that, I want to create a "Batch Configurer" in order to get specific datasource instead of the default one.
为了解决这个问题,我会在数据源上添加一个限定符来指定应该在步骤中使用哪个:
@Configuration
public class MssqlBatchConfigurationStep {
private DataSource dataSource;
/**
*
* @param dataSource
*/
public MssqlBatchConfigurationStep(@Qualifier("YOUR_MSSQL_DATASOURCE_BEAN_NAME") DataSource dataSource) {
this.dataSource = dataSource;
}
}
这样,您的 reader 应该指向 mssql 数据源并从中读取数据。
您需要添加一个辅助数据源 bean 并自动装配该数据源。
application.properties
spring.second-datasource.url = [url]
spring.second-datasource.username = [username]
spring.second-datasource.password = [password]
spring.second-datasource.driverClassName= [driverClassName]
数据源配置
@Primary
@Bean(value = "defaultDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource datasource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
return dataSource;
}
@Bean(value = "secondDataSource")
@ConfigurationProperties(prefix = "spring.second-datasource")
public DataSource ticketDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
return dataSource;
}
在您的 reader.
中自动装配 secondDataSource
private DataSource dataSource;
/**
*
* @param dataSource
*/
public MssqlBatchConfigurationStep(@Qualifier("secondDataSource") DataSource dataSource) {
this.dataSource = dataSource;
}
我需要访问两个数据源:
- Spring批次仓库:内存H2
- 我的步骤需要访问
mssql
。
我在那里看到了几个关于如何创建自定义 batch configurer
的示例。
但是,有时:
implements BatchConfigurer
extends DefaultBatchConfigurer
目前我的配置文件是:
.
├── steps
│ └── MssqlBatchConfigurationStep.java
└── MainJobBatchConfiguration.java
我的步骤配置是:
@Configuration
public class MssqlBatchConfigurationStep {
private DataSource dataSource;
/**
*
* @param dataSource
*/
public MssqlBatchConfigurationStep(DataSource dataSource) {
this.dataSource = dataSource;
}
/**
*
* @return
*/
public ItemReader<Unitat> reader() {
String sql = "SELECT operation,update_time,table_name,rowid,user_login,user_name, user_ip,application_name,application_version,new_value,old_value FROM renovastorage.data_log";
JdbcCursorItemReader<Unitat> jdbcCursorItemReader = new JdbcCursorItemReader<>();
jdbcCursorItemReader.setDataSource(this.dataSource);
jdbcCursorItemReader.setSql(sql);
jdbcCursorItemReader.setVerifyCursorPosition(false);
jdbcCursorItemReader.setRowMapper(new UnitatRowMapper());
return jdbcCursorItemReader;
}
/**
*
* @return
*/
public ItemWriter<UnitatDenormalized> writer() {
// write to solr
return null;
}
}
这里的问题是,这一步是获取默认数据源。此数据源与 Spring Batch
.
为了解决这个问题,我想创建一个 "Batch Configurer"
来获取特定数据源而不是默认数据源。
在这里你可以看到我的工作配置:
@Configuration
@EnableBatchProcessing
// @EnableScheduling
public class MainJobBatchConfiguration {
private JobBuilderFactory jobBuilderFactory;
private StepBuilderFactory stepBuilderFactory;
private MssqlBatchConfigurationStep unitatBatchStep;
/**
*
* @param jobBuilderFactory
* @param stepBuilderFactory
*/
public MainJobBatchConfiguration(
JobBuilderFactory jobBuilderFactory,
StepBuilderFactory stepBuilderFactory,
MssqlBatchConfigurationStep unitatBatchStep
) {
this.jobBuilderFactory = jobBuilderFactory;
this.stepBuilderFactory = stepBuilderFactory;
this.unitatBatchStep = unitatBatchStep;
}
/**
*
* @return
*/
@Bean
public Step step() {
return this.stepBuilderFactory
.get("mssql")
.<Unitat, UnitatDenormalized>chunk(10)
.reader(this.unitatBatchStep.reader())
.writer(this.unitatBatchStep.writer())
.build();
}
/**
*
* @param step
* @return
*/
@Bean
public Job job(Step step) {
Job job = this.jobBuilderFactory.get("job1")
.flow(step)
.end()
.build();
return job;
}
}
My step needs to get access to a mssql.
In order to solve that, I want to create a "Batch Configurer" in order to get specific datasource instead of the default one.
为了解决这个问题,我会在数据源上添加一个限定符来指定应该在步骤中使用哪个:
@Configuration
public class MssqlBatchConfigurationStep {
private DataSource dataSource;
/**
*
* @param dataSource
*/
public MssqlBatchConfigurationStep(@Qualifier("YOUR_MSSQL_DATASOURCE_BEAN_NAME") DataSource dataSource) {
this.dataSource = dataSource;
}
}
这样,您的 reader 应该指向 mssql 数据源并从中读取数据。
您需要添加一个辅助数据源 bean 并自动装配该数据源。
application.properties
spring.second-datasource.url = [url]
spring.second-datasource.username = [username]
spring.second-datasource.password = [password]
spring.second-datasource.driverClassName= [driverClassName]
数据源配置
@Primary
@Bean(value = "defaultDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource datasource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
return dataSource;
}
@Bean(value = "secondDataSource")
@ConfigurationProperties(prefix = "spring.second-datasource")
public DataSource ticketDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
return dataSource;
}
在您的 reader.
中自动装配 secondDataSource private DataSource dataSource;
/**
*
* @param dataSource
*/
public MssqlBatchConfigurationStep(@Qualifier("secondDataSource") DataSource dataSource) {
this.dataSource = dataSource;
}