Да, вы правы, что WebFlux Framework не поддерживает базы данных SQL в неблокирующем режиме, потому что реактивные драйверы не существуют.Но WebFlux предоставляет некоторые инструменты, чтобы избежать блокировки наших основных потоков, пока мы делаем блокировку длинных запросов к базе данных.
1) Создайте конфигурацию с Scheduler
, где количество потоков равно размеру пула:
@Configuration
public class SchedulerConfiguration {
@Value("${spring.datasource.maximum-pool-size}
private final Integer connectionPoolSize;
@Bean
@Qualifier("jdbcScheduler")
public Scheduler jdbcScheduler() {
return Schedulers.fromExecutor(Executors.newFixedThreadPool(connectionPoolSize));
}
}
2) Вставьте ваш "jdbcScheduler" в класс обслуживания:
@Service
public class DataService {
@Autowired
private final DataRepository jdbcRepository;
@Autowired @Qualifier("jdbcScheduler")
private final Scheduler scheduler;
public Mono<String> findById(long id) {
return async(() -> repository.findById(id));
}
private <T> Mono<T> async(Callable<T> callable) {
return Mono.fromCallable(callable).publishOn(scheduler);
}
}
Оберните ваш метод блокировки с помощью Mono.fromCallable и делегируйте из основного потока ваш "планировщик" через Mono.publishOn
Подробнее о планировщиках вы можете прочитать здесь: Потоки и планировщики