Получить Java.Util.List из Flux в Spring Web Reactive Framework - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть конечная точка, которая должна получить документ Excel с использованием класса ExcelUtility, который ожидает Java.Util.List.

Я использую Mongodb для получения данных, но Mongodb возвращает Flux myList.

Как я могу "дать" классу ExcelUtility список myList для создания класса Workbook, который я могу вернуть в ResponseEntity?

Пока у меня есть этот код:

final Workbook myWorkBook = ExcelUtils                               
.pojo2xlsx(this.myMongoRepository.findAll()
.toStream().collect(Collectors.toList()), 
 MyType.class);

Метод myMongoRepository.findAll возвращает Flux .Это стандартный интерфейс ReactiveMongoRepository.

Я полагаю, что проблема сводится к тому, что мне нужно «заблокировать» поток, чтобы получить список, чтобы моя пользовательская служба Excel могла принимать обычный список.Я могу сделать это в тестовом коде, но при запуске в Web Reactive Framework кажется, что ему запрещено блокировать.

1 Ответ

2 голосов
/ 24 апреля 2019

Предполагая, что вы вызываете это из нужного вам реактивного контекста

Mono<Workbook> wb = s.collectList().map(l -> ExcelUtils.pojo2xlsx(l));

В этом сценарии вы не хотите начинать работу самостоятельно или вызывать блокировку в потоках, управляемых реактивным планировщиком. Вы просто вернете этот новый Mono в фреймворк и дадите ему решить, когда и как планировать работу.

Однако, если вы вызываете это из обычного метода, который должен вернуть рабочую книгу, у вас нет выбора, кроме как заблокировать, но ожидание этого синхронного метода состоит в том, что вы начнете работу и заблокируете, пока она не завершится в любом случае .

...