java - 可从享元中自行移除资源

标签 java caching design-patterns reactivex flyweight-pattern

我正在处理具有不同资源的应用程序,我需要关闭这些资源,同时使用 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/

相关文章:

java - 防止 Swing 动画跳跃

c# - .NET 4 缓存支持

javascript - HTML5 缓存行为不当

java - Builder类中的director如何将一个null int设置为0?

java - 如何从私有(private)静态内部类访问变量

java - 在另一个类中运行网络操作时出现网络策略违规

java - 如何在servlet中使用ajax请求中传递的json对象

php - 如何在 apache 和 php_cli 之间共享 APC 缓存?

c# - 使用 C# 的 Interface<T> 接口(interface)

c# - 通过工厂问题和注意事项涉及实体创建的单元测试类