2016-10-30 6 views
0

私はデータを取得できる2つのHTTPサービスを持っています。RxJavaでのHTTPフォールバック

  1. キャッシュバックエンド
  2. レアルバックエンド

時間のほとんどは、実際のバックエンドは、秒以内に結果を得ることができます。いくつかの10%の場合、1秒以上かかる。

私は、以下を行うRxJava演算子を探しています。

Real Backendにクエリを送信します。 1秒以内にonNextを取得できなかった場合は、キャッシュバックエンドに起動します。

実際のバックエンドに1秒以上かかった場合、キャッシュと実際のバックエンドの両方からonNextで放出されたアイテムを取得します。

ここで使用する正しい演算子は何ですか?

MergeDelayErrorオペレータ 私はこの演算子を使用する場合、それは常に本当のバックエンドが十分に高速であれば不要であるだけでなくキャッシュバックエンドに発生します。

答えて

0

Try#2:キャッシュ。 takeUntil + merge

Observable<String> cache = Observable.timer(2, TimeUnit.SECONDS) 
    .map(new Function<Long, String>() { 
     public String apply(Long t) throws Exception { 
      System.out.println("Invoking cached"); 
      return "cached"; 
     } 
    }); 

    Observable<String> original = Observable.timer(5, TimeUnit.SECONDS) 
     .map(new Function<Long, String>() { 
      public String apply(Long t) throws Exception { 
       System.out.println("Invoking original"); 
       return "originalBackend"; 
      } 
     }); 

    Observable<String> originalOnce = original.cache(); 
    Observable<String> result = cache.takeUntil(originalOnce).mergeWith(originalOnce); 

    result.subscribe(new Consumer<String>() { 
     public void accept(String result) throws Exception { 
      System.out.println(result); 
     } 
    }); 
+0

公共最終観測タイムアウト(長いタイムアウト、 java.util.concurrent.TimeUnit TIMEUNIT、他の 観測) は、指定されたタイムアウト後に観察を実行達成することができます。しかし、それは本当のバックエンドのonNextを欠場するでしょう。 Timeout + onErrorReturn –

+0

@ nizam.spで述べた内容を正確に得ることができませんでした。なぜなら、2つのイベントを発生させるタイムアウトのケースが1つのキャッシングで、もう1つはバックエンドアップデートの後です。 – Ivan

関連する問題