내가 어떤 쿼리 기준에 따라 찾거나 위젯을 구성합니다, API를 가지고 말 같은 :비동기 자바 벡터/스트림 데이터에 대한 합성 가능한 반환 값은 9
try {
Widget w = getMatchingWidget(criteria);
processWidget(w);
} catch (Throwable t) {
handleError(t);
}
이제 말을 찾거나 위젯을 구성하는 것은 예상치 못한 비용, 그리고 내가 기다리는 동안 클라이언트는 차단하지 않습니다.
CompletableFuture<Widget> getMatchingWidget(WidgetCriteria c)
클라이언트는 다음 쓸 수 있습니다 :
CompletableFuture<Widget> f = getMatchingWidget(criteria);
f.thenAccept(this::processWidget)
f.exceptionally(t -> { handleError(t); return null; })
나 : 그래서으로 변경 이제
getMatchingWidget(criteria).whenComplete((t, w) -> {
if (t != null) { handleError(t); }
else { processWidget(t); }
});
대신 동기식 API가 n 개의 위젯 0을 반환 할 수의 말을하자 :
Stream<Widget> getMatchingWidgets(WidgetCriteria c)
순진, 내가 쓸 수있다 : - Widgets
사용할 수 있습니다, 또는 모든 때까지 어느 Future
블록
CompletableFuture<Stream<Widget>> getMatchingWidgets(WidgetCriteria c)
그러나,이 실제로 코드 비 차단을하지 않습니다, 그것은 단지 주변의 차단을 밀어 각 Widget
을 기다리는 Stream
블록을 반복하는 코드. 내가 원하는처럼 그들이 도착하는 날 각 위젯을 처리 할 무언가, 무언가이다 :
void forEachMatchingWidget(WidgetCriteria c, Consumer<Widget> widgetProcessor)
하지만이 오류 처리를 제공하지 않습니다, 나는 추가 Consumer<Throwable> errorHandler
를 추가 할 경우에도, 그것은 나를하지 않습니다 예를 들어 내 위젯 검색을 다른 쿼리로 작성하거나 결과를 변환 할 수 있습니다.
그래서 Stream
(반복성, 변환 가능성)의 특성과 CompletableFuture
(비동기 결과 및 오류 처리)의 특성을 결합하여 구성 가능한 것을 찾고 있습니다. (우리가 작업하는 동안 역 압력은 좋을 수도 있습니다.)
java.util.concurrent.Flow.Publisher이 맞습니까? io.reactivex.Observable? 더 복잡한 무엇입니까? 좀 더 단순한가?
대기열에 물건을 넣고 대기열에서 물건을 꺼내는 경향이 있습니다. –