Spring Batch: sumber data untuk Batch dan sumber data untuk step
Saya perlu mendapatkan akses ke dua sumber data:
- Repositori batch musim semi: dalam memori H2
- Langkah saya perlu mendapatkan akses ke
mssql.
Saya telah melihat beberapa contoh di sana tentang cara membuat kustom batch configurer.
Namun, terkadang:
implements BatchConfigurerextends DefaultBatchConfigurer
Saat ini, file konfigurasi saya adalah:
.
├── steps
│ └── MssqlBatchConfigurationStep.java
└── MainJobBatchConfiguration.java
Konfigurasi langkah saya adalah:
@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;
}
}
Masalahnya di sini adalah, langkah ini mendapatkan sumber data default. Sumber data ini sama dengan yang didapat Spring Batch.
Untuk mengatasinya, saya ingin membuat sebuah "Batch Configurer"untuk mendapatkan sumber data tertentu, bukan yang default.
Di sini Anda dapat melihat konfigurasi pekerjaan saya:
@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;
}
}
Jawaban
Anda perlu menambahkan bean sumber data sekunder dan melakukan autowire sumber data tersebut.
application.properties
spring.second-datasource.url = [url]
spring.second-datasource.username = [username]
spring.second-datasource.password = [password]
spring.second-datasource.driverClassName= [driverClassName]
Konfigurasi sumber data
@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;
}
Pasang otomatis secondDataSource di pembaca Anda.
private DataSource dataSource;
/**
*
* @param dataSource
*/
public MssqlBatchConfigurationStep(@Qualifier("secondDataSource") DataSource dataSource) {
this.dataSource = dataSource;
}
Langkah saya perlu mendapatkan akses ke mssql.
Untuk mengatasinya, saya ingin membuat "Batch Configurer" untuk mendapatkan sumber data tertentu, bukan yang default.
Untuk mengatasinya, saya akan menambahkan kualifikasi pada sumber data untuk menentukan mana yang harus digunakan pada langkah:
@Configuration
public class MssqlBatchConfigurationStep {
private DataSource dataSource;
/**
*
* @param dataSource
*/
public MssqlBatchConfigurationStep(@Qualifier("YOUR_MSSQL_DATASOURCE_BEAN_NAME") DataSource dataSource) {
this.dataSource = dataSource;
}
}
Dengan itu, pembaca Anda harus mengarah ke sumber data mssql dan membaca data darinya.