创建Flux.fromIterable后如何运行onClose操作?

时间:2020-06-09 05:24:15

标签: java project-reactor flux reactor autocloseable

假设我们需要基于Flux资源的内容创建一个Closeable。 为了清楚起见,假设有一个BufferedReader要转换为Flux<String>

BufferedReader reader = createReader("my_resource_path");
Flux<String> flux = Flux.fromIterable(() -> iteratorOfLines(reader));

让我们假设iteratorOfLines产生一组有限的项目。

BufferedReader消耗掉了其中的所有数据,或者由于某种原因不需要剩余的数据(即订阅被中止)时,我正在寻找一种关闭Flux的方法。

有一个构造函数reactor.core.publisher.FluxIterable(Iterable iterable, Runnable onClose),但是:

  1. 似乎无法从反应堆的公共API到达(甚至是传递)
  2. 我怀疑它是否会有所帮助,因为它无法解决Flux在获得迭代器中的最后一项之前停止的情况。

Flux.fromIterable发布最后一项之后,清理/关闭资源的正确方法是什么?

可能有比fromIterable更好的方法来做类似的事情,因此欢迎所有选择。

1 个答案:

答案 0 :(得分:2)

要尝试使用资源,您可以使用using

    Flux.using(
            //Set up resource
            () -> createReader("my_resource_path"),
            //Create flux from resource
            reader -> Flux.fromIterable(iteratorOfLines(reader)),
            //Perform action (cleanup/close) 
            //when resource completes/errors/cancelled
            reader -> {
                try{
                    reader.close();
                }catch(IOException e){
                    throw Exceptions.propagate(e);
                }
            }
    );