@Wan-Derer
Зобанели на Хабре, волки́ ;((

Как наполнять Flux по мере поступления данных?

Допустим, я хочу создать Flux и наполнить его данными, получаемыми, например, и БД. Я могу написать так:
public Flux<Integer> getFlux(){

  List<Integer> values = new ArrayList<>();

  for (int i = 0; i < 10; i++) {
    values.add(someLongTimeProcedure());
  }
  
  return Flux.fromIterable(values);
}

private Integer someLongTimeProcedure() {
  // здесь запрос в БД
  return РЕЗУЛЬТАТ_ЗАПРОСА;
}


Но в этом случае Flux будет создан только после то как будет наполнен List. А как сделать так чтобы Flux был создан заранее, а данные "проталкивались" в него по мере их получения?
Важный момент: кол-во элементов конечно. Т.е. в какой-то момент я должен сказать Flux что всё, данных больше не будет.
  • Вопрос задан
  • 180 просмотров
Пригласить эксперта
Ответы на вопрос 1
xez
@xez Куратор тега Java
TL Junior Roo
Для этого есть Sinks:

public static void main(String[] args) throws Exception {
        Sinks.Many<Integer> sinks = Sinks.many()
                .multicast() 
                .onBackpressureBuffer(); // Изучайте документацию. Тут много вариантов

        sinks.asFlux()
                .subscribe(System.out::println);

        // В очереди ничего нет. Ничего не происходит
        Thread.sleep(1000);
        
        // Наполняем очередь элементами
        sinks.tryEmitNext(1);
        sinks.tryEmitNext(2);
        sinks.tryEmitNext(3);
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы