我有两个业务逻辑步骤:
将输出(对象列表)分派到外部队列
@Bean
public Job job() throws Exception {
return this.jobs.get("job").start(getXmlViaHttpStep()).next(pushMessageToQueue()).build();
}
所以我的第一步是Tasklet,它下载(通过http)文件并将其转换为Objects。
我的第二个任务是另一个Tasklet,它假定从上一步调度输出。
现在如何将步骤1的输出列表传递给step2(作为输入)?
我可以将其保存在临时文件中,但是还没有其他最佳实践方案吗?
答案 0 :(得分:2)
我可以看到至少两个可行的选项。
选项1:将作业设置为一步 您可以将作业设置为包含一个步骤,读者只需从URL读取输入,然后作者就会发布到您的队列中。
选项2:将作业设置为中间存储的两个步骤 但是,您可能希望将作业分为两个步骤,以便在失败时重新运行步骤并简化调试等。在该cas中,以下方法可能适用于您:
FlatFileItemReader
或类似的步骤用于下载文件。然后,该步骤可以配置FlatFileItemWriter
以将内容移动到磁盘。ItemWriter
生成的文件。一种替代方法是使用org.springframework.batch.item.xml.StaxEventItemReader
和Jaxb2Marshaller
来处理处理(如this blog中所述)。配置输出步骤以使用例如消息将消息发布到队列org.springframework.batch.item.jms.JmsItemWriter
。作者(一如既往地)被分块,因此每次写作都可以发布多条消息。就个人而言,我可能会将整个事情设置为选项2 。我发现简单的步骤没有太多的转换更容易遵循,也更容易测试,但这只是一个品味问题。