【问题标题】:Is it possible to have multiple readers for one step in spring batch?春季批次中的一个步骤是否可以有多个阅读器?
【发布时间】:2020-12-14 11:50:42
【问题描述】:

我需要创建一个 spring 批处理,其中我需要从 2 个不同的表中获取数据。 这将是读者部分。

问题是我需要有 2 个读者查询。并且只会根据条件调用其中一个。 但作家将是一样的。 这样tasklet就基本一样了。

我可以在一个步骤中拥有 2 个读取器,根据条件调用它吗..??

类似spring批处理xml里面的东西:

if (condition)
then reader1
else reader2


...
....
......


<reader1 id=".." class="..">

</reader1>

.....
........

<reader2 id=".." class="..">

</reader2>

【问题讨论】:

  • only one of them will be called based on the condition: 条件是什么?工作参数?系统属性?在上一步中计算的东西?我认为您的情况不需要两个阅读器,这是 IMO 配置的问题。

标签: spring spring-batch


【解决方案1】:

您是否考虑过使用 Spring Batch 提供的条件控制流模式?我认为这可能会导致更简单的构造,并遵守 spring batch 鼓励的一些核心模式。

您基本上编写了您希望在其下调用步骤的“条件”。所以定义两个步骤,比如说step1,它有一个对象类型的读取器、处理器和写入器,step2 有另一个类型的读取器、处理器和写入器。也许作者也在类型之间共享。然后您可以像这样定义控制流:

    @Bean
    public Job myJob() {
        JobBuilder jobBuilder = jobs.get("Spring Batch: conditional steps");
     
        return jobBuilder.start(determineRoute())
                             .on("item1").to(flow1())
                             .on("item2").to(flow2()).end()
                         .build();
                 
    }

在示例中,determineRoute() 是一个 tasklet,它返回自定义 ExitStatus 值 item1 或 item2 & flow1 和 flow2 是处理每个对象的不同流程(或步骤)。

请参阅他们的文档:https://docs.spring.io/spring-batch/docs/current/reference/html/step.html#conditionalFlow

编辑:你也可以用JobExecutionDeciderhttps://www.baeldung.com/spring-batch-conditional-flow#2-programmatic-branching-withjobexecutiondecider做类似的事情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 2020-08-10
    相关资源
    最近更新 更多