private <T> Observable<T> reduce(Observable<List<AstrixServiceInvocationResponse>> responses) { if (targetReturnType.equals(Void.TYPE) || targetReturnType.equals(Void.class)) { return responses.map(responseList -> { readResults(responseList); return null; }); } final RemoteResultReducer<T> reducer = newRemoteResultReducer(); return responses.map(responseList -> { List<AstrixRemoteResult<T>> unmarshalledResponses = new ArrayList<>(responseList.size()); for (AstrixServiceInvocationResponse response : responseList) { AstrixRemoteResult<T> result = remotingEngine.toRemoteResult(response, targetReturnType); unmarshalledResponses.add(result); } return reducer.reduce(unmarshalledResponses); }); }
private <T> Observable<T> submitBroadcastRequest( AstrixServiceInvocationRequest request, Object[] args) throws InstantiationException, IllegalAccessException { request.setArguments(remotingEngine.marshall(args)); final RemoteResultReducer<T> reducer = (RemoteResultReducer<T>) newReducer(); Observable<List<AstrixServiceInvocationResponse>> responesObservable = remotingEngine.submitBroadcastRequest(request); if (returnType.equals(Void.TYPE) || returnType.equals(Void.class)) { return responesObservable.map(responses -> { readResponses(responses); return null; }); } return responesObservable.map(responses -> { List<AstrixRemoteResult<T>> unmarshalledResponses = new ArrayList<>(); for (AstrixServiceInvocationResponse response : responses) { AstrixRemoteResult<T> result = remotingEngine.toRemoteResult(response, returnType); unmarshalledResponses.add(result); } return reducer.reduce(unmarshalledResponses); }); }