Наблюдаемый из итерируемого не печатает все элементы - PullRequest
0 голосов
/ 29 октября 2018

Я использую RxJava2 Observable.fromIterable () в веб-сервисе Rest. Мой итеративный пример состоит из трех элементов, но моя неблокирующая служба отдыха возвращает только один элемент на три.

class ToDoDaoImpl implements ToDoDao {
  Map<String, ToDo> toDos;
  ...
  public Observable<ToDo> readAll() {
    return Observable.fromIterable(toDos.entrySet().stream().map(entry -> entry.getValue()).collect(Collectors.toList()));
  }
}

Когда я вызываю метод readAll () из моей библиотеки Non-Blocking Rest, я получаю только один элемент из трех:

@Api(path = "/api/v2/read", method = "GET", produces = "application/json")
Action readAllToDos = (HttpServletRequest request, HttpServletResponse response) -> {
    Observable.just(request)
            .flatMap(req -> toDoDao.readAll())
            .subscribe(output  -> toJsonResponse(request, response, new ResponseDto(200, output)),
                       error   -> toJsonResponse(request, response, new ResponseDto(200, error))
            );
};

Мой вывод:

{
"status": 200,
"response": {
    "id": "5dc74dd8-1ea9-427e-8bb7-482cc6e24c71",
    "title": "learn ReactiveJ",
    "description": "learn to use ReactiveJ library",
    "date": {
        "year": 2018,
        "month": 10,
        "day": 29
    }
},
"datetime": "Oct 29, 2018 4:19:51 PM"
}

Если я назову нереактивный эквивалент моего Дао, я получу то, что ожидаю:

{
"status": 200,
"response": [
    {
        "id": "25cbe3bf-12be-42e4-82ce-d4780f6469f6",
        "title": "study reactive",
        "description": "learn reactive programming",
        "date": {
            "year": 2018,
            "month": 10,
            "day": 29
        }
    },
    {
        "id": "51879241-f005-43fa-80fb-78386b663cb7",
        "title": "learn ReactiveJ",
        "description": "learn to use ReactiveJ library",
        "date": {
            "year": 2018,
            "month": 10,
            "day": 29
        }
    },
    {
        "id": "80a07c1b-2317-4eb8-9a39-ac35260f37a2",
        "title": "exercise",
        "description": "do some exercises",
        "date": {
            "year": 2018,
            "month": 10,
            "day": 29
        }
    }
],
"datetime": "Oct 29, 2018 4:37:05 PM"
}

1 Ответ

0 голосов
/ 29 октября 2018

Если вы поставите doOnNext перед подпиской, вы увидите, что вы получаете несколько элементов, но, очевидно, toJsonResponse может доставить только один элемент. Могу поспорить, что ваша нереактивная версия просто передала все List ResponseDto.

Я не уверен, почему вы усложнили задачу, но это должно сработать:

class ToDoDaoImpl implements ToDoDao {
    Map<String, ToDo> toDos;
    // ...
    public Observable<List<ToDo>> readAll() {
        return Observable.fromCallable(() -> new ArrayList<>(toDos.values()));
    }
}

@Api(path = "/api/v2/read", method = "GET", produces = "application/json")
Action readAllToDos = (HttpServletRequest request, HttpServletResponse response) -> 
{
    toDoDao.readAll()
        .subscribe((List<ToDo output)  -> 
            toJsonResponse(request, response, new ResponseDto(200, output)),
                   error   -> 
            toJsonResponse(request, response, new ResponseDto(200, error))
        );
};
...