- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在处理具有不同资源的应用程序,我需要关闭这些资源,同时使用 react 流。
我有一个基于享元模式的工厂,它保留对对象的引用,并且它们实现了 AutoCloseable 接口(interface)。问题是我在 Autocloseable 类中使用 close() ,这是我的问题:删除对工厂内已关闭资源的引用的最佳解决方案是什么?我可以抛出某种事件并在工厂中捕获它,或者在每个可以关闭资源的操作之后我应该迭代引用映射并删除关闭的资源吗?
为了更好的上下文:我正在使用reactivex Observable,它会发出目录事件(创建、删除文件/目录),并且在每个订阅者取消订阅它之后,我将关闭我正在使用的WatchService。
编辑#1
这是我的工厂类的样子:
public final class Factory {
private final ConcurrentHashMap<String, ReactiveStream> reactiveStreams = new ConcurrentHashMap<>();
public ReactiveStream getReactiveStream(Path path) throws IOException {
ReactiveStream stream = reactiveStreams.get(path.toString());
if (stream != null) return stream;
stream = new ReactiveStream(path);
reactiveStreams.put(path.toString(), stream);
return stream;
}
}
这是我的 ReactiveStream 类的样子:
public class ReactiveStream implements AutoCloseable {
(...)
private WatchService service;
private Observable<Event> observable;
public Observable<Event> getObservable() throws IOException {
(...) // where i create observable
return observable;
}
(...)
@Override
public void close() throws IOException {
service.close();
}
}
正如你所看到的,我有一个工厂,它保留对 ReactiveStream 类的引用,该类在可观察后自行关闭,将不再被订阅(我以使用 doOnUnsubscribe(() -> close() 的方式做到了这一点)在对 observable 使用 share() 之前,因此当没有订阅者时,将调用 doOnUnsubscribe)。
我的问题是,在关闭后如何从 Factory 中删除对已关闭 ReactiveStream 的引用?
编辑#2
observable = Observable.fromCallable(new EventObtainer()).flatMap(Observable::from).subscribeOn(Schedulers.io()).repeat().doOnUnsubscribe(() -> {
try {
close();
} catch (IOException e) {
e.printStackTrace();
}
}).share();
这是我创建可观察对象的方法。 EventObtainer 是 ReactiveStream 中的嵌套类,它使用 WatchService,需要在每个订阅者停止订阅后关闭。
最佳答案
今天我的同事告诉我解决这个问题的最佳解决方案。所以我创建了界面:
@FunctionalInterface
public interface CustomClosable {
void onClosing();
}
并在构造函数中添加对该接口(interface)的引用到ReactiveStream。
现在我正在调用 onClosing.onClosing() ,我需要关闭资源。
由于工厂类负责声明其资源关闭后应该执行的操作,而且我没有循环依赖,因此我的 ReactiveStream 类可以多次重用。
关于java - 可从享元中自行移除资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40615142/
我发现以下帖子非常有帮助: How to pickle yourself? 但是,此解决方案的局限性在于,重新加载类时,它不会以其“运行时”状态返回。即它将重新加载所有变量等以及类在转储时的一般状态.
我是一名优秀的程序员,十分优秀!