如何在一个作业执行中阻止一个弹簧作家

时间:2014-09-22 01:50:14

标签: java spring spring-batch

我使用spring批处理每隔5分钟将数据从redis导入数据库,这就是我的工作。

我使用redis.keys命令一次写一个redis阅读器,读取我想要的所有密钥,而不是将这些密钥传输给jdbc writer。

问题是,一旦作业启动,阅读器将连续运行,但我只想在一次批量作业运行中执行一次redis.keys命令。 有人知道如何做到这一点吗?


更新thx @Michael Minella 我实现了ItemStreamReader接口,其中open()方法在作业步骤开始之前只执行一次。此外,我还实现了ItemListenerSupport接口,在read()方法之后每次都会执行afterRead()方法。所以在open()方法中,我从redis中检索数据,将其放在map中,在read()中返回map,并在afterRead()中将map设置为null。因此,下次执行read()时,它将返回null,表示作业将完成。 但它有点棘手,也许春季批量可以添加一个只在每个作业实例中运行一次的Reader接口。

1 个答案:

答案 0 :(得分:1)

Spring Batch ItemReadersItemWriters还可以扩展名为ItemStream的其他接口。此接口提供了一些对此方案有用的其他生命周期方法。在您的情况下,我建议您使用ItemStream.open方法进行实际读取。这在步骤开始时调用一次。然后,在ItemReader.read方法中,您可以遍历查询结果。 Spring Batch提供了许多使用此技术的ItemReader实现。一个例子是JdbcCursorItemReader谁的源代码可以在这里找到:https://github.com/spring-projects/spring-batch/blob/master/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcCursorItemReader.java