2017-08-01 40 views
2

我必須進行N REST API調用併合並所有這些調用的結果,或者如果至少有一個調用失敗(返回錯誤或超時),則失敗。 我想用RxJava,我有一些要求:如何使用RxJava製作多個API請求並將它們合併?

  • 能夠在某些情況下,以配置每個單獨的API調用的重試。我的意思是,如果我有一個重試= 2,並且我提出了3個請求,則每個請求最多需要重試2次,總共最多有6個請求。
  • 快速失敗!如果一次API調用失敗了N次(其中N是重試的配置),但如果剩餘的請求還沒有結束,那麼它並不重要,我想返回一個錯誤。

如果我希望用一個線程完成所有的請求,我需要一個異步Http客戶端,不會嗎?

謝謝。

回答

1

你可以使用Zip運營商,一旦他們結束拉上所有的請求一起,檢查那裏,如果他們都是成功

private Scheduler scheduler; 
private Scheduler scheduler1; 
private Scheduler scheduler2; 

/** 
* Since every observable into the zip is created to subscribeOn a different thread, it´s means all of them will run in parallel. 
* By default Rx is not async, only if you explicitly use subscribeOn. 
*/ 
@Test 
public void testAsyncZip() { 
    scheduler = Schedulers.newThread(); 
    scheduler1 = Schedulers.newThread(); 
    scheduler2 = Schedulers.newThread(); 
    long start = System.currentTimeMillis(); 
    Observable.zip(obAsyncString(), obAsyncString1(), obAsyncString2(), (s, s2, s3) -> s.concat(s2) 
      .concat(s3)) 
      .subscribe(result -> showResult("Async in:", start, result)); 
} 

private Observable<String> obAsyncString() { 
    return Observable.just("Request1") 
      .observeOn(scheduler) 
      .doOnNext(val -> { 
       System.out.println("Thread " + Thread.currentThread() 
         .getName()); 
      }) 
      .map(val -> "Hello"); 
} 

private Observable<String> obAsyncString1() { 
    return Observable.just("Request2") 
      .observeOn(scheduler1) 
      .doOnNext(val -> { 
       System.out.println("Thread " + Thread.currentThread() 
         .getName()); 
      }) 
      .map(val -> " World"); 
} 

private Observable<String> obAsyncString2() { 
    return Observable.just("Request3") 
      .observeOn(scheduler2) 
      .doOnNext(val -> { 
       System.out.println("Thread " + Thread.currentThread() 
         .getName()); 
      }) 
      .map(val -> "!"); 
} 

在這個例子中,我們卻只是CONCAT的結果,而不是這樣做,你可以檢查結果並在那裏做你的業務邏輯。也可以考慮mergecontact

您可以在這裏https://github.com/politrons/reactive

+0

看看更多的例子創造了超過1'Schedulers.newThread()'是不必要的。它爲每個創建的工作人員創建一個新的線程,因此只需重複使用相同的調度程序就可以獲得相同的結果。 – Kiskae

相關問題