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