当前位置: 首页 > 知识库问答 >
问题:

在Spring Batch中重复步骤x次

闾丘炫明
2023-03-14

我正在使用配置了注释的Spring Batch 3.0.3来创建一个批处理作业,该作业以不确定的次数重复一个步骤。

我的第一步是将重复步骤中使用的项目列表读入内存。我希望重复这些步骤来遍历这个工作范围列表。

如何将作业配置为运行相同的步骤x次?我在xml中看到了指定下一步运行的示例。我想我可以在一个无限循环中指向彼此的两个步骤,直到列表被迭代。这行得通吗?有没有办法通过注释来实现?下面是我的主配置文件,其中有些代码不起作用。

@ComponentScan(excludeFilters = @Filter(IgnoreDuringScan.class))
@EnableAutoConfiguration
@EnableBatchProcessing
@Loggable
public class BatchCrudConfiguration
{
    @Bean
    public Job batchCRUDJob(JobBuilderFactory jobBuilderFactory, Step[] processSheetSteps)
    {
        JobBuilder jobBuilder = jobBuilderFactory.get("batchCRUDJob").incrementer(new RunIdIncrementer());
        FlowBuilder<FlowJobBuilder> jobFlowBuilder = jobBuilder.flow(processSheetSteps[0]);
        for (int i = 1; i < processSheetSteps.length; i++)
        {
            jobFlowBuilder = jobFlowBuilder.next(processSheetSteps[i]);
        }
        return jobFlowBuilder.end().build();
    }

    @Bean
    public Step[] processSheetSteps(
            StepBuilderFactory stepBuilderFactory,
            RawDataReader[] readers,
            DelegatingWriter writer,
            DelegatingProcessor processor,
            @Value("${batchcrud.chunkSize}") int chunkSize)
    {
        int numberOfReaders = readers.length;
        Step[] steps = new Step[numberOfReaders];
        for (int i = 0; i < numberOfReaders; i++)
        {
            steps[i] = stepBuilderFactory.get("processSheet" + i + "Step").<RawData, DataItem>
                    chunk(chunkSize).reader(readers[i]).processor(processor).writer(writer).build();
        }
        return steps;
    }

共有1个答案

鲁羽
2023-03-14

我将通过以下方式来实现这一点:

  1. 第一步加载列表
  2. 第二步处理列表中的项目
  3. 第二个步骤有一个StepExecutionListener,用于评估列表中是否有更多项目需要处理。如果是这样,它将返回映射到同一步骤的ExitStatus。如果没有,它将返回一个映射到结束作业或继续作业(基于流的其余部分)的ExitStatus

例如:

StepExecutionListener

public class MyListener {

    @Autowired
    private List myItems;

    @AfterStep
    public ExitStatus afterStep(StepExecution stepExecution) {
        if(myItems.size() > 0) {
            return new ExitStatus("CONTINUE");
        }
        else {
            return new ExitStatus("FINISHED");
        }
    }
}

作业配置

...
@Bean
public Step step1() {...}

@Bean
public MyListener listener() {..}

@Bean
public Step step2(MyListener listener) {
    return stepBuilder.get("step2")
                .tasklet(myTasklet()) // Replace this piece as needed
                .listener(listener).build();
}

@Bean
public Job job1(Step step1, Step step2) {
    return jobBuilder.get("job1")
                     .start(step1)
                     .next(step2).on("CONTINUE").to(step2).on("FINISHED").end()
                     .build();
}
...

注意:我还没有测试过这段代码,所以可能会出现拼写错误等。

 类似资料:
  • 我创建了一个图,它显示了一组数据和直方图。让我困扰的是,如下所示,直方图上的X轴有一个20步,因此最后一个值是140,而不是150,这严重触发了我的强迫症。有人能帮我修理它吗? 生成的png文件: https://i.stack.imgur.com/NhBYM.png 以及守则的有关部分: 非常感谢。

  • 我必须在一次登录中运行多个案例的功能文件。对于ex: 场景:当用户使用“用户名”和“密码”登录并且用户检查“on”和用户检查“on”时,检查总计 示例: |用户名|密码|金额1|日期1|金额2|日期2|... 我需要在一次登录中检查日期金额,而在我的场景中,每次登录数据表中的每个条目。我如何实现它? 相反,我希望这样: 当用户使用“用户名”和“密码”登录时 示例: |用户名|密码|...只使用一次

  • 遵循下面的引导,在 OS X 上构建 Electron . 前提 OS X >= 10.8 Xcode >= 5.1 node.js (外部) 如果你通过 Homebrew 使用 Python 下载,需要安装下面的 Python 模块: pyobjc 获取代码 $ git clone https://github.com/electron/electron.git Bootstrapping b

  • 我将硒与cucumber一起使用(使用JAVA,但不太相关) 假设我有以下场景: 功能:示例功能 场景:在网站上执行操作A给定网站已打开,用户输入正确的登录名并传入字段,用户按“登录”,然后执行操作A 场景:在网站上执行操作A给定网站已打开,用户输入正确的登录名并传入字段,然后用户按“登录”,然后执行操作B 现在,将有数百个场景,网站总是需要登录到网站,所以我假设对于每个测试场景,我必须重复登录步

  • 我有一个spring批处理作业,预计将根据FIFO顺序处理'N'个作业ID。这个Spring批处理作业有5个步骤。 我们使用DECIDER来确定是否有更多的job-id。如果是,请转到第一步并运行该job-id的所有步骤。 我在spring-batch发出的日志中看到“duplicate step”消息,在第一个作业中的步骤(例如job-id=1)获得未知状态之前,该消息似乎没有问题。在这种情况下

  • 假设我有以下流程,开始- 我为每个步骤创建了tasklet并配置了一个作业,如上所述。当作业被触发时,执行一直到Step3,它会无限循环。那么在JobFlow中有没有一种方法可以多次执行一个步骤。 我使用的是Spring Batch 4.2.1。释放