我使用的是Spring批處理版本2.2.4.RELEASE 我試圖用有狀態的ItemReader,ItemProcessor和ItemWriter bean編寫一個簡單的例子。Spring批處理@BeforeStep不能用@StepScope
public class StatefulItemReader implements ItemReader<String> {
private List<String> list;
@BeforeStep
public void initializeState(StepExecution stepExecution) {
this.list = new ArrayList<>();
}
@AfterStep
public ExitStatus exploitState(StepExecution stepExecution) {
System.out.println("******************************");
System.out.println(" READING RESULTS : " + list.size());
return stepExecution.getExitStatus();
}
@Override
public String read() throws Exception {
this.list.add("some stateful reading information");
if (list.size() < 10) {
return "value " + list.size();
}
return null;
}
}
在我的集成測試,我宣佈在內部靜態Java配置類類似下面我豆類:
@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class SingletonScopedTest {
@Configuration
@EnableBatchProcessing
static class TestConfig {
@Autowired
private JobBuilderFactory jobBuilder;
@Autowired
private StepBuilderFactory stepBuilder;
@Bean
JobLauncherTestUtils jobLauncherTestUtils() {
return new JobLauncherTestUtils();
}
@Bean
public DataSource dataSource() {
EmbeddedDatabaseBuilder embeddedDatabaseBuilder = new EmbeddedDatabaseBuilder();
return embeddedDatabaseBuilder.addScript("classpath:org/springframework/batch/core/schema-drop-hsqldb.sql")
.addScript("classpath:org/springframework/batch/core/schema-hsqldb.sql")
.setType(EmbeddedDatabaseType.HSQL)
.build();
}
@Bean
public Job jobUnderTest() {
return jobBuilder.get("job-under-test")
.start(stepUnderTest())
.build();
}
@Bean
public Step stepUnderTest() {
return stepBuilder.get("step-under-test")
.<String, String>chunk(1)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
@Bean
public ItemReader<String> reader() {
return new StatefulItemReader();
}
@Bean
public ItemProcessor<String, String> processor() {
return new StatefulItemProcessor();
}
@Bean
public ItemWriter<String> writer() {
return new StatefulItemWriter();
}
}
@Autowired
JobLauncherTestUtils jobLauncherTestUtils;
@Test
public void testStepExecution() {
JobExecution jobExecution = jobLauncherTestUtils.launchStep("step-under-test");
assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus());
}
}
該測試通過。
但只要我定義我StatefulItemReader的一步作用域的bean(這是有狀態的讀者更好地),在「步驟之前」代碼不再執行。
...
@Bean
@StepScope
public ItemReader<String> reader() {
return new StatefulItemReader();
}
...
而且我注意到處理器和我的編寫器豆的相同問題。
我的代碼有什麼問題?這是否與這個解決問題:https://jira.springsource.org/browse/BATCH-1230
幾個JUnit測試我的整個Maven項目可以在GitHub上找到:https://github.com/galak75/spring-batch-step-scope
預先感謝您爲您的回答。
這可能是一個錯誤。看來代理版本的閱讀器/處理器/寫入器沒有被自動註冊爲StepListener。我在Jira中創建了一個問題來跟蹤它的工作:https://jira.springsource.org/browse/BATCH-2169 –
@Géraud,我添加了另一個在Singleton範圍內執行CompositeItemProcessor場景的測試,它也失敗了。我已經向GitHub發送了一個拉取請求。我會爲此添加或修改Jira。 – hoserdude
@hoserdude,對不起,我這些時間都非常忙碌......我會盡快接受您的拉客請求 –