我有如下的CompositeItemProcessor
<bean id="compositeItemProcessor" class="org.springframework.batch.item.support.CompositeItemProcessor">
<property name="delegates">
<list>
<bean class="com.example.itemProcessor1"/>
<bean class="com.example.itemProcessor2"/>
<bean class="com.example.itemProcessor3"/>
<bean class="com.example.itemProcessor4"/>
</list>
</property>
</bean>
我遇到的问题是,在itemProcessor4中,我需要itemProcessor1和itemProcessor3中的值。
我已经看过使用“步骤执行上下文”,但这不起作用,因为它在一步之内。我还研究了在ItemProcessor1中使用@AfterProcess,但这无法工作,因为直到ItemProcessor4之后才调用它。
在CompositeItemProcessor中的委托人之间共享数据的正确方法是什么?
在提交间隔设置为1的情况下,是否可以使用在itemProcessor1中更新并在itemProcessor4中读取的util:map?
答案 0 :(得分:1)
使用步骤执行上下文将无法工作,因为它会保留在块边界,因此无法在同一块内的处理器之间共享。
在注册的项目处理器之后调用 AfterProcess
,注册的项目处理器是您的情况下的复合处理器(因此在ItemProcessor4之后)。这也不行。
剩下的唯一选择是使用项目处理器之间共享的某些数据持有者对象。
希望这会有所帮助。
答案 1 :(得分:0)
此页面似乎表明有两种类型的ExecutionContexts,一种在步骤级,一种在作业级。
https://docs.spring.io/spring-batch/trunk/reference/html/patterns.html#passingDataToFutureSteps
您应该能够从步骤上下文中获取作业上下文并为其设置键
答案 2 :(得分:0)
我的申请中也有类似的要求。我创建了一个 data transfer object
ItemProcessorDto
,它将被所有 ItemProcessors
共享。您可以将数据存储在第一个处理器中的这个 DTO 对象中,所有剩余的处理器将从这个 DTO 对象中获取信息。除此之外,任何 ItemProcessor
都可以 update
或 retrieve
DTO 中的数据。
以下是代码片段:
@Bean
public ItemProcessor1<ItemProcessorDto> itemProcessor1() {
log.info("Generating ItemProcessor1");
return new ItemProcessor1();
}
@Bean
public ItemProcessor2<ItemProcessorDto> itemProcessor2() {
log.info("Generating ItemProcessor2");
return new ItemProcessor2();
}
@Bean
public ItemProcessor3<ItemProcessorDto> itemProcessor3() {
log.info("Generating ItemProcessor3");
return new ItemProcessor3();
}
@Bean
public ItemProcessor4<ItemProcessorDto> itemProcessor4() {
log.info("Generating ItemProcessor4");
return new ItemProcessor4();
}
@Bean
@StepScope
public CompositeItemProcessor<ItemProcessorDto> compositeItemProcessor() {
log.info("Generating CompositeItemProcessor");
CompositeItemProcessor<ItemProcessorDto> compositeItemProcessor = new CompositeItemProcessor<>();
compositeItemProcessor.setDelegates(Arrays.asList(itemProcessor1(), itemProcessor2(), itemProcessor3), itemProcessor4()));
return compositeItemProcessor;
}
@Data
public class ItemProcessorDto {
private List<String> sharedData_1;
private Map<String, String> sharedData_2;
}