Как перебрать моновызов метода возврата Mono - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь добиться следующего в методе ниже

  1. Получить все автомобили от дилера X
  2. Создать объект-обертку, в котором хранится набор всех автомобилей идругой набор всех производителей 2a.Заполните Автомобили набором с автомобилями, полученными на шаге 1
  3. . Для каждого автомобиля получите все свои независимые производители.
  4. Сохраните все полученные производства в упаковочные объекты. Набор
  5. Возврат Mono ofАвтомобиль и производит
Mono<CarAndManufactures> requestCarAndManufactures(Request req) {
final String dealerId = buildDealerId(req.getDealerRegion(), req.getDealerId());
final CarAndManufactures CarAndManufactures = new CarAndManufactures();
return webSocketClient.getCars(dealerId) //note #getCars returns a Mono
    .map(getCarsResponse -> getCarsResponse
      .getResult()
      .stream()
      .map(Car::getId)
      .collect(toSet()))
    .map(carIds -> {
      CarAndManufactures.setCars(carIds);
      return CarAndManufactures;
    })
    .flatMapMany(CarAndManufactures1 -> Flux.fromIterable(CarAndManufactures.getCars().keySet()))
    .collectList()
    .log("Existing cars")
    .flatMap(carIds -> { //This is the problem area
      carIds
          .stream()
          .map(carId -> {
            webSocketClient.getManufactures(carId) //Note getManufactures returns a Mono... This method does look like its ever called
                .map(getManufactureResponse -> getManufactureResponse
                    .getResult()
                    .stream()
                    .map(Manufacture::getId)
                    .collect(toSet()))
                .map(ManufactureIds -> {
                  CarAndManufactures.SetManufactures(ManufactureIds); //since the line commented on above is not called the Manufacture Set is empty
                  return CarAndManufactures;
                });
            return CarAndManufactures;
          });
          return just(CarAndManufactures);
        }
    )
    .log("Car And Manufactures"); 

}

Набор производств всегда пуст, не выглядит как webSocketClient.getManufactures (carId).Я думал, что я могу пропустить .subscribe кое-где, но так как это используется контроллером webflux, я думаю, что #subscribes нигде не нужны

1 Ответ

0 голосов
/ 24 февраля 2019

Все еще не понимаю, почему ниже работает, но код из OP не работает.Добавлен Flux.fromIterable внутри последней flatMap вместо ранее, и теперь используется addAll для добавления набора изготовления, поскольку наборы наборов теперь идут по одному за раз вместо того, чтобы все они были доступны раньше.

Mono<CarAndManufactures> requestCarAndManufactures(Request req) {
final String dealerId = EntityUtil.buildDealerId(req.getDealerRegion(), req.getDealerId());

return webSocketClient.getCars(req.getApiKey(), dealerId)
    .map(getCarsResponse -> getCarsResponse
        .getResult()
        .stream()
        .collect(toMap(AppCar::getId,
            appCar -> new MutablePropertyManager(appCar.getProps().getSize()))))
    .map(stringImmutablePropertiesMap -> {
      CarAndManufactures CarAndManufactures = new CarAndManufactures();
      CarAndManufactures.setCars(stringImmutablePropertiesMap);
      return CarAndManufactures;
    })
    .flatMap(CarAndManufactures ->
        Flux.fromIterable(CarAndManufactures.getCars().keySet())
            .flatMap(s -> webSocketClient.getManufacturesByCar(req.getApiKey(), s)
                .map(getManufacturesResponse -> getManufacturesResponse
                    .getResult()
                    .stream()
                    .map(AppManufacture::getId)
                    .collect(toSet()))
                .map(ManufactureIds -> {
                  CarAndManufactures.addManufactures(ManufactureIds);
                  return CarAndManufactures;
                }))
            .last())
    .log("Car And Manufactures");

}

...