使用Spring Boot与SQL数据库连接进行服务器发送事件

时间:2018-09-28 17:49:23

标签: spring-boot server-sent-events spring-webflux

我想在Spring Boot中实现服务器发送事件。数据在SQL数据库中,导致阻塞连接。 Web Flux是一个选项,但仅某些NoSQL数据库支持。

2 个答案:

答案 0 :(得分:0)

是的,通过使用其内置的@Async处理,您可以在春季实现无磁通的异步处理。

第一步:启用Aysnc并为Executor定义一个bean。您可以定义单独的配置,也可以直接在Main应用程序类下定义。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity name" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@ AND SUBQUERY(logs, $log, $log.typeID == 3).@count != 0", items];
[fetchRequest setPredicate:predicate];
fetchRequest.fetchLimit = 5;
NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {

}

STEP2:

以下是将具有空返回类型的方法配置为异步运行的简单方法,您也可以通过使用Future对象检索异步过程的结果来调用该方法。

@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;
    }

有关更多信息,请访问Spring官方指南Spring Async

答案 1 :(得分:0)

是的,您对,WebFlux框架不是非阻塞模式下的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将主线程委托给您的“调度程序”

有关调度程序的更多信息,您可以在这里阅读:Threading and Schedulers