Java 观察移除/处置订阅服务器时要关闭的可关闭资源

Java 观察移除/处置订阅服务器时要关闭的可关闭资源,java,rx-java,rx-java2,Java,Rx Java,Rx Java2,我正在开发一个小的子系统,它使用rxjava2集成了两个简单的组件。 这两个组件以一种简单的客户机-服务器方式工作,其中第一个组件通过打开引擎盖下的资源来生成可观察的数据。 资源未公开给第二个组件。 此外,只要可观察对象在使用,它就必须是打开的,但是可观察对象无法确定何时应该关闭它。 就代码而言,示例实现如下所示: 私人一次性; public void onCreate(){ final Maybe maybeResource=Maybe.defer(()->{ System.out.print

我正在开发一个小的子系统,它使用rxjava2集成了两个简单的组件。 这两个组件以一种简单的客户机-服务器方式工作,其中第一个组件通过打开引擎盖下的资源来生成可观察的数据。 资源未公开给第二个组件。 此外,只要可观察对象在使用,它就必须是打开的,但是可观察对象无法确定何时应该关闭它。 就代码而言,示例实现如下所示:

私人一次性;
public void onCreate(){
final Maybe maybeResource=Maybe.defer(()->{
System.out.println(“打开”);
//这是隐藏在引擎盖下的资源,它被封装在可观察的环境中,永远不会暴露出来
最终可关闭资源=()->{};
可能返回。只是(资源)
.doOnDispose(()->{
//从未调用此“析构函数”,导致资源泄漏
系统输出打印项次(“关闭”);
resource.close();
})
//任意数据,不代表我正在使用的数据,但它隐藏了资源
.map(可关闭->新建对象());
});
一次性=maybeResource.subscribe(数据->系统输出.println(“进程:“+data”);
}
公共无效onUserWorflow(){
// ...
系统输出打印项次(“……”);
// ...
}
公共空间{
一次性的,一次性的;
}
我期望得到的结果是:

open
process: <...>
... ... ...
close         <-- this is never produced
打开
过程:
... ... ...

关闭我想您需要使用
Observable.create()
而不是Maybe。 诸如此类:

final Observable<Object> resourceObservable = Observable.create<Object> {(emitter ->
        // do you staff
        emitter.onNext(new Object()); //to make observable emit something
        emitter.setCancellable ( 
           System.out.println("close");
           resource.close(); 
        )
    );

disposable = resourceObservable.subscribe(data -> System.out.println("process: " + data));
final Observable resourceObservable=Observable.create{(发射器->
//你们有员工吗
emitter.onNext(new Object());//使可观察对象发射某些东西
emitter.setCancelable(
系统输出打印项次(“关闭”);
resource.close();
)
);
一次性=resourceObservable.subscribe(数据->系统.out.println(“进程:+data”);

我想您需要使用
Observable.create()
而不是Maybe。 诸如此类:

final Observable<Object> resourceObservable = Observable.create<Object> {(emitter ->
        // do you staff
        emitter.onNext(new Object()); //to make observable emit something
        emitter.setCancellable ( 
           System.out.println("close");
           resource.close(); 
        )
    );

disposable = resourceObservable.subscribe(data -> System.out.println("process: " + data));
final Observable resourceObservable=Observable.create{(发射器->
//你们有员工吗
emitter.onNext(new Object());//使可观察对象发射某些东西
emitter.setCancelable(
系统输出打印项次(“关闭”);
resource.close();
)
);
一次性=resourceObservable.subscribe(数据->系统.out.println(“进程:+data”);

Hm,这似乎是我想要的,至少对于
Flowable
,谢谢。让我问你:
为什么可能不这样做呢?我的意思是,如果我对
maybeimitter
使用
setcancelable
,资源会在“用户工作流”之前关闭.为什么?还有一个问题:我应该使用
setDisposable
而不是
setcancelable
?老实说:我对
不太熟悉,可能
,我从未使用过它(与可流动、单一、可观察相比,没有看到任何提示)。所以不知道为什么它对你不起作用。关于使用
setDisposable
:根据文档,它几乎是一样的,但是你必须实现
Disposable
,它有两个方法,而不是
cancelable
中的1个。所以我使用
setcancelable
,据我的理解,
可能是一个可空的
单个
,我可以看出它有很好的语义。也许行为不同,因为“maybies”只能有一个值,而不是“flowables”,或者我只是遇到了一个bug。需要阅读文档。谢谢!嗯,这似乎是我想要的,至少对于
Flowable
,谢谢。让我问你:
为什么可能
不这样做?我的意思是,如果我对
Maybeimitter
使用
setCancelable
,资源会在“用户工作流”之前关闭.为什么?还有一个问题:我应该使用
setDisposable
而不是
setcancelable
?老实说:我对
不太熟悉,可能
,我从未使用过它(与可流动、单一、可观察相比,没有看到任何提示)。所以不知道为什么它对你不起作用。关于使用
setDisposable
:根据文档,它几乎是一样的,但是你必须实现
Disposable
,它有两个方法,而不是
cancelable
中的1个。所以我使用
setcancelable
,据我的理解,
可能是一个可空的
单个
,我可以看到它有很好的语义。也许行为的不同是因为“maybies”只能有一个值,而不是“flowables”,或者我只是遇到了一个bug。需要阅读文档。谢谢!