私は、反応ストリームで作業しながら、私は閉じる必要があるさまざまなリソースを持つアプリケーションで作業しています。フライウェイトからの自己削除可能なリソース
私は、オブジェクトへの参照を保持するフライウェイトパターンに基づいたファクトリを持っており、AutoCloseableインターフェイスを実装しています。問題は私がclose()を使用しているのですが、 のAutocloseableクラスです。私の質問です。工場内の閉じたリソースへの参照を削除するにはどうすればよいですか?何らかのイベントをスローして工場で捕まえることができますか、リファレンスマップを繰り返してクローズドリソースを削除すれば、リソースを閉じることができるすべてのアクションの後に行うことができますか?
コンテキスト: 私は、ディレクトリイベント(作成、ファイル/ディレクトリの作成)を発行するreactx 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();
}
}
私がdoOnUnsubscribe(() - > close()を使って共有を使う前に、それを観察することができます) )が観測可能になるので、サブスクライバが存在しないときは、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はWatchServiceを使用するReactiveStreamのネストされたクラスであり、すべてのサブスクライバがサブスクライブを停止すると終了する必要があります。
非常に不明瞭で手荒い質問です。私はあなたが書いていることのほとんどが、あなたが持っている問題とは無関係であると感じています。あなたが持っている問題は、非常に表面的に記述されています。 –
コードを理解しやすくするためのコードを追加しました。 –
'doOnUnsubscribe()'というコードを表示します。 –