Như M. Deinum đã đề xuất, tôi cũng sẽ đặt cấu hình của các nguồn dữ liệu trong một tệp riêng biệt.
Bên cạnh đó, có những vấn đề sau trong tệp cấu hình của bạn:
-
SpringBatch tìm kiếm một nguồn dữ liệu có tên là "dataSource" (lưu ý chữ S viết hoa). Nếu không tìm thấy, nó sẽ tìm bất kỳ nguồn dữ liệu nào mà nó tìm thấy. Tuy nhiên, nếu nó tìm thấy nhiều hơn một, nó sẽ ném ra một ngoại lệ -> ngoại lệ mà bạn đã quan sát.
-
Trong tệp cấu hình của mình, bạn tạo hai nguồn dữ liệu và đưa một nguồn vào (@Autowosystem Datasource dataSourceSecond). Điều này sẽ gây ra sự cố tiếp theo, vì bạn không có nguồn dữ liệu với tên này. (Bạn chỉ xác định các nguồn dữ liệu "SecondaryDataSource" và "primaryDataSource"). Điều này cũng sẽ dẫn đến một ngoại lệ.
Đây là cách tôi sắp xếp các cấu hình của mình
@Configuration
public DatasourceConfiguration {
@Bean
@ConfigurationProperties(prefix="spring.seconddatasource")
public javax.sql.DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
// note the new name: dataSource -> this is the name springBatch is looking for
@Bean
@ConfigurationProperties(prefix="spring.datasource")
public javax.sql.DataSource dataSource() {
return DataSourceBuilder.create().build();
}
}
@Configuration
@EnableBatchProcessing
@Import(DatasourceConfiguration.class)
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
// note the name
@Autowired
public DataSource secondaryDataSource;
@Bean
public JdbcCursorItemReader<User> reader()
{
JdbcCursorItemReader<User> reader=new JdbcCursorItemReader<>();
// note the name
reader.setDataSource(secondaryDataSource);
reader.setSql("Select ACCT_ID from ACCT_table FETCH FIRST 100 ROWS ONLY");
reader.setRowMapper(new UserRowerMapper());
return reader;
}
...
Tôi cũng đã viết một câu trả lời cặn kẽ hơn cho một câu hỏi tương tự: Tôi muốn tạo một dự án hàng loạt mùa xuân trong đó batch không sử dụng nguồn dữ liệu của tôi