Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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 创建Flux.fromIterable后如何运行onClose操作?_Java_Project Reactor_Flux_Reactor_Autocloseable - Fatal编程技术网

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

Java 创建Flux.fromIterable后如何运行onClose操作?,java,project-reactor,flux,reactor,autocloseable,Java,Project Reactor,Flux,Reactor,Autocloseable,假设我们需要根据可关闭的资源的内容创建一个流量。 为清楚起见,请说明有一个BufferedReader要转换为Flux BufferedReader reader=createReader(“我的资源路径”); 通量通量=通量.fromIterable(()->迭代器(读卡器)); 让我们假设,iteratorOfLines生成一组有限的项 我正在寻找一种方法来关闭BufferedReader,当Flux消耗了它的所有数据,或者由于某种原因不需要剩余的数据时(即订阅被中止) 有一个构造函数re

假设我们需要根据
可关闭的
资源的内容创建一个
流量
。 为清楚起见,请说明有一个
BufferedReader
要转换为
Flux

BufferedReader reader=createReader(“我的资源路径”);
通量通量=通量.fromIterable(()->迭代器(读卡器));
让我们假设,
iteratorOfLines
生成一组有限的项

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

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

  • 似乎从反应堆的公共API无法访问(甚至是传递)
  • 我怀疑它是否有帮助,因为它没有涵盖通量在获得iterable中的最后一项之前停止的情况

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


    可能有比fromIterable的
    更好的方法来做类似的事情,所以欢迎使用所有选项。

    对于尝试使用资源的等效方法,您可以使用
    使用

        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);
                    }
                }
        );
    

    不知道为什么这会被否决-我个人更喜欢它,而不是
    doFinally()
    。我相信这是一个更干净的解决方案,以防使用可关闭的资源。在我看来,
    doFinally
    属于不同的抽象层,即出版物生命周期维护。@diziaq是的,我个人更喜欢任何资源都使用它,因为它将所有内容整齐地打包在链中的一个位置
        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);
                    }
                }
        );