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)
,但是:
在
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);
}
}
);