2016-11-15 9 views
3

私は、反応ストリームで作業しながら、私は閉じる必要があるさまざまなリソースを持つアプリケーションで作業しています。フライウェイトからの自己削除可能なリソース

私は、オブジェクトへの参照を保持するフライウェイトパターンに基づいたファクトリを持っており、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のネストされたクラスであり、すべてのサブスクライバがサブスクライブを停止すると終了する必要があります。

+0

非常に不明瞭で手荒い質問です。私はあなたが書いていることのほとんどが、あなたが持っている問題とは無関係であると感じています。あなたが持っている問題は、非常に表面的に記述されています。 –

+0

コードを理解しやすくするためのコードを追加しました。 –

+0

'doOnUnsubscribe()'というコードを表示します。 –

答えて

0

今日、私の同僚はこの問題を解決する最善の解決策を教えてくれました。だから私はインターフェイスを作成しました:

@FunctionalInterface 
public interface CustomClosable { 

    void onClosing(); 

} 

このインターフェイスのリファレンスをコンストラクタのReactiveStreamに追加しました。

また、私はリソースを閉じる必要があるonClosing.onClosing()を呼び出しています。

私のReactiveStreamクラスは何度も再利用できるので、そのリソースが閉じられた後に何をすべきかを宣言する責任が工場のクラスにあります。

関連する問題