Как создать поток списков с помощью Spring Webflux? - PullRequest
0 голосов
/ 14 ноября 2018

Я использую Spring Webflux и ReactiveMongoRepository в проекте Spring Boot, и я хочу, чтобы каждый поток представлял собой список объектов, как показано ниже, например:

// 1st Flux Started:
[
{
// 1st Dashboard
},
{
// 2nd Dashboard
}
]
// 1st Flux Ended
// 2nd Flux Started:
[
{
// 1st Dashboard
},
{
// 2nd Dashboard
}
]
// 2nd Flux Ended

Хранилище:

@Repository
public interface ReactiveDashboardRepository extends ReactiveMongoRepository<Dashboard, String> {
}

Услуга:

@Service
public class ReactiveDashboardServiceImpl implements ReactiveDashboardService {

    private ReactiveDashboardRepository reactiveDashboardRepository;

    public ReactiveDashboardServiceImpl(ReactiveDashboardRepository reactiveDashboardRepository) {
        this.reactiveDashboardRepository = reactiveDashboardRepository;
    }

    public Flux<Dashboard> getDashboards() {

        return this.reactiveDashboardRepository.findAll();
    }


}

Контроллер:

@CrossOrigin
@RestController
@RequestMapping("/api/sse")
public class ReactiveDashboardRestController {

    private ReactiveDashboardService reactiveDashboardService;

    public ReactiveDashboardRestController(ReactiveDashboardService reactiveDashboardService) {
        this.reactiveDashboardService = reactiveDashboardService;
    }

    @GetMapping(value = "/dashboards", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<Dashboard> getDashboards() {
        return this.reactiveDashboardService.getDashboards();
    }

}

Так что, в основном, я хочу, чтобы все объекты в массиве были частью одного потока, потому что именно так создается клиентское приложение, которое я буду использовать. На данный момент их всего 3. Так что в каждом потоке будет храниться массив всего объекта. Я знаю, что это не лучшее использование webflux. Как этого достичь, если это возможно?

1 Ответ

0 голосов
/ 14 ноября 2018

Если вам нужен бесконечный поток, который отправляет данные с интервалом, вам нужна функция «интервал».

Для простоты вашего кода я бы порекомендовал возвращать вам Dashboards напрямую в List и преобразовывать список в Flux вваш контроллер.

Это будет что-то вроде:

    List<Dashboard> lDashBoard = new ArrayList<Dashboard>(Arrays.asList(
            Dashboard.builder().name("Dash1").build(),
            Dashboard.builder().name("Dash2").build(),
            Dashboard.builder().name("Dash3").build()
            ));
    Flux<List<Dashboard>> intervalFlux = Flux
            .interval(Duration.ofMillis(500))
            .map(tick -> {
                return lDashBoard;
            });
    intervalFlux.subscribe(t->log.info("Dashboards:{}", lDashBoard));

Вывод будет выглядеть так:

2018-11-14 15:55:18.575  INFO [Dashboards:[Dashboard(name=Dash1), Dashboard(name=Dash2), Dashboard(name=Dash3)]
2018-11-14 15:55:19.073  INFO [Dashboards:[Dashboard(name=Dash1), Dashboard(name=Dash2), Dashboard(name=Dash3)]
2018-11-14 15:55:19.573  INFO [Dashboards:[Dashboard(name=Dash1), Dashboard(name=Dash2), Dashboard(name=Dash3)]
...