Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在一次作业执行中停止spring编写器_Java_Spring_Spring Batch - Fatal编程技术网

Java 如何在一次作业执行中停止spring编写器

Java 如何在一次作业执行中停止spring编写器,java,spring,spring-batch,Java,Spring,Spring Batch,我使用SpringBatch每5分钟将数据从redis导入DB,下面是我的工作 我编写了一个redis阅读器,使用redis.keys命令一次性读入我想要的所有密钥,然后将这些密钥传输到jdbc编写器 问题是,一旦作业启动,读取器将连续运行,但我只希望在一次批处理作业运行中执行redis.keys命令一次。 有人知道如何做到这一点吗 更新thx@Michael Minella 我实现了ItemStreamReader接口,其中的open()方法在作业步骤开始之前只执行一次。此外,我还实现了It

我使用SpringBatch每5分钟将数据从redis导入DB,下面是我的工作

我编写了一个redis阅读器,使用redis.keys命令一次性读入我想要的所有密钥,然后将这些密钥传输到jdbc编写器

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


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

spring batch
ItemReaders
ItemWriter
还可以扩展一个名为
ItemStream
的附加接口。此接口提供了一些对该场景有用的其他生命周期方法。在您的情况下,我建议在
ItemStream.open
方法中进行实际读取。在步骤开始时调用一次。然后,在
ItemReader.read
方法中,可以迭代查询结果。Spring批处理提供了许多使用此技术的
ItemReader
实现。一个例子是
JdbcCursorItemReader
who的源代码可以在这里找到: