【问题标题】:Spring Batch CompositeItemProcessor get value from other delegatesSpring Batch CompositeItemProcessor 从其他委托中获取值
【发布时间】:2019-02-27 12:31:53
【问题描述】:

我有一个复合项目处理器,如下所示

<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 的值。

我已经研究过使用 Step Execution Context 但这不起作用,因为这是在一个步骤内。我也看过在 ItemProcessor1 中使用 @AfterProcess 但这不起作用,因为它直到 ItemProcessor4 之后才被调用。

在compositeItemProcessor 中的委托之间共享数据的正确方法是什么?

在commit-interval设置为1的情况下,是否使用util:map在itemProcessor1中更新,在itemProcessor4中读取的解决方案?

【问题讨论】:

    标签: spring spring-batch


    【解决方案1】:

    使用步骤执行上下文将不起作用,因为它在块边界处持久化,因此不能在同一块内的处理器之间共享。

    AfterProcess 在注册的项目处理器之后调用,在您的情况下它是复合处理器(所以在 ItemProcessor4 之后)。这也行不通。

    剩下的唯一选择是使用一些您在项目处理器之间共享的数据持有者对象。

    希望这会有所帮助。

    【讨论】:

    • 感谢我的编辑,我现在已经在 spring 配置中声明了一个地图。除非您认为有更好的数据存储方式?
    • 我也会这样做,使用在处理器之间共享的类型映射 bean。
    【解决方案2】:

    这个页面似乎声明了有两种类型的 ExecutionContexts,一种在步骤级别,一种在作业级别。

    https://docs.spring.io/spring-batch/trunk/reference/html/patterns.html#passingDataToFutureSteps

    您应该能够从步骤上下文中获取作业上下文并在其上设置键

    【讨论】:

    • 我已经检查了这个页面,但它没有显示我如何访问 stepExecutioner。如果我将“@BeforeStep”添加到 ItemProcessors 之一,它不会被调用。如上所述,如果我使用“@AfterStep”或“@AfterProcess”,它们将不会在需要时被调用。
    【解决方案3】:

    我的申请中也有类似的要求。我创建了一个data transfer objectItemProcessorDto,它将由所有ItemProcessors 共享。您可以将数据存储在第一个处理器中的此 DTO 对象中,所有剩余的处理器将从该 DTO 对象中获取信息。除此之外,任何ItemProcessor 都可以updateretrieve 将数据从DTO 中取出。

    下面是代码sn-p:

    @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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      相关资源
      最近更新 更多