来自轻量级的自动可移动资源

时间:2016-11-15 16:37:45

标签: java caching design-patterns reactivex flyweight-pattern

我正在处理使用不同资源的应用程序,我需要关闭它,同时使用反应流。

我的工厂基于flyweight模式,它保持对对象的引用,并且它们实现了AutoCloseable接口。问题是我在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(()) - &gt; close())在observable上使用share()之前,所以当没有订阅者时,将调用doOnUnsubscribe)。

我的问题是,如何在关闭之后将工厂的引用移除到已关闭的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,需要在每个订阅者停止订阅后关闭。

1 个答案:

答案 0 :(得分:0)

今天我的同事告诉我解决这个问题的最佳解决方案。所以我创建了界面:

@FunctionalInterface
public interface CustomClosable {

    void onClosing();

}

并在Constructor中将此接口的引用添加到ReactiveStream。

现在我正在调用onClosing.onClosing(),我需要关闭资源。

由于工厂类负责声明在资源关闭后应该执行的操作,并且我没有循环依赖,因此我的ReactiveStream类可以多次重用。