Сервер отправил событие с подключением к базе данных SQL с помощью Spring Boot - PullRequest
0 голосов
/ 28 сентября 2018

Я хочу реализовать отправленные события сервера в Spring Boot.Данные есть в базе данных SQL, это приводит к блокировке соединения.Web Flux - это опция, но она поддерживается только для некоторых баз данных NoSQL.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Да, вы правы, что 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

Подробнее о планировщиках вы можете прочитать здесь: Потоки и планировщики

0 голосов
/ 30 сентября 2018

Да, вы можете достичь асинхронной обработки весной без изменений, используя встроенную обработку @Async, вот как вы можете ее достичь.

Step1: Включить Aysnc и определить bean-компонент для Executor,Вы можете определить отдельную конфигурацию или непосредственно в Главном классе приложения.

@SpringBootApplication
@EnableAsync
public class Application {

    public static void main(String[] args) {
        // close the application context to shut down the custom ExecutorService
        SpringApplication.run(Application.class, args).close();
    }

    @Bean
    public Executor asyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(2);
        executor.setMaxPoolSize(2);
        executor.setQueueCapacity(500);
        executor.setThreadNamePrefix("GithubLookup-");
        executor.initialize();
        return executor;
    }

STEP2:

Ниже приведен простой способ настройки метода с пустым типом возврата для запуска.Асинхронно. Вы также можете вызвать метод, получив результат асинхронного процесса с использованием объекта Future.

@Async
public void asyncMethodWithVoidReturnType() {
    System.out.println("Execute method asynchronously. "
      + Thread.currentThread().getName());
}

Для получения дополнительной информации посетите официальное руководство Spring Spring Async

...