2017-11-03 11 views
0

주어진 사용 사례에 적절한 구조를 찾는 데 문제가 있습니다.N 요청이 완료 될 때까지 X 요청을 병렬로 실행합니다.

주어진 입력 문자열에 대해 Single<String>을 생성하는 기능이 있습니다. 이 Single은 최대 30 분이 소요될 것으로 예상되는 여러 작업의 조합이지만이 질문과 관련이 없다고 생각합니다.

내가 달성하고자하는 동작은 5 개의 작업을 N 개의 작업을 완료하는 목표와 동시에 활성화하는 것입니다. 작업은 시간이 많이 걸릴뿐만 아니라 비싸기 때문에 이후에 폐기 될 초과 작업을 시작해서는 안됩니다. 어떻게 든이 작업의 결과를 병합하는 것은 중요하지 않습니다. 단순히 각 결과를 onSuccess에 보관합니다.

그래서 기본적으로 내 계획은 카운터와 onTerminate을 증가 onComplete, 그들에게 구독 (5)에 의해 카운터를 증가, 루프, 그리고 0에서 시작하는 카운터 변수가 5 Single을 생성하는 것입니다 counter < N 경우, 다른 Single을 시작하십시오.

그러나 결국에는 재귀 적으로 생성 된 Single 개체를 추적하는 좋은 방법이 없지만 N 완료 될 때까지 기다려야합니다.

이렇게 쉽게 만들 수있는 구조가 있습니까? 아니면 카운터 또는 Disposable의 목록을 사용하여이 작업을 수행해야합니까?

답변

1

flatMap() 연산자는 유지 관리하는 동시 구독 수인 추가 매개 변수를 사용합니다. 그 어떤 flatMap() 작품이기 때문에

@Test 
public void testStuff() throws Exception { 
    Single<String> source; 
    PublishSubject<String> src = PublishSubject.create(); 
    src 
      .flatMap(s -> doStuff(s).toObservable(), 5) 
      .subscribe(v -> { // process v 
      }); 
} 

Single<String> doStuff(String subject) { 
    return Single.just(subject); 
} 

doStuff() 만약 리턴한다 Single을, 당신은 Observable로 변환해야 다음은 테스트 샘플입니다.