Spring Batch CompositeItemProcessor从其他代表获取价值

时间:2019-02-27 12:31:53

标签: spring spring-batch

我有如下的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?

3 个答案:

答案 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 都可以 updateretrieve 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;
}