在弹簧批处理步骤之间传递输出

时间:2014-12-31 12:35:43

标签: java spring spring-batch

我有两个业务逻辑步骤:

  1. 从外部资源解析下载xml并将其转换为对象
  2. 将输出(对象列表)分派到外部队列

    @Bean
    public Job job() throws Exception {
        return this.jobs.get("job").start(getXmlViaHttpStep()).next(pushMessageToQueue()).build();
    }
    
  3. 所以我的第一步是Tasklet,它下载(通过http)文件并将其转换为Objects。

    我的第二个任务是另一个Tasklet,它假定从上一步调度输出。

    现在如何将步骤1的输出列表传递给step2(作为输入)?

    我可以将其保存在临时文件中,但是还没有其他最佳实践方案吗?

1 个答案:

答案 0 :(得分:2)

我可以看到至少两个可行的选项。

选项1:将作业设置为一步 您可以将作业设置为包含一个步骤,读者只需从URL读取输入,然后作者就会发布到您的队列中。

选项2:将作业设置为中间存储的两个步骤 但是,您可能希望将作业分为两个步骤,以便在失败时重新运行步骤并简化调试等。在该cas中,以下方法可能适用于您:

  • 步骤1:创建一个FlatFileItemReader或类似的步骤用于下载文件。然后,该步骤可以配置FlatFileItemWriter以将内容移动到磁盘。
  • 步骤2:打开上一步中ItemWriter生成的文件。一种替代方法是使用org.springframework.batch.item.xml.StaxEventItemReaderJaxb2Marshaller来处理处理(如this blog中所述)。配置输出步骤以使用例如消息将消息发布到队列org.springframework.batch.item.jms.JmsItemWriter。作者(一如既往地)被分块,因此每次写作都可以发布多条消息。

就个人而言,我可能会将整个事情设置为选项2 。我发现简单的步骤没有太多的转换更容易遵循,也更容易测试,但这只是一个品味问题。