我有这样一个控制器和这样一个服务类。为什么我在IDEA中得到这个警告-“Possibly blocking call in non-blocking context could lead to thread starvation
“?
@PostMapping(value = {"/create"})
public Mono<ResponseEntity<ResponseDto>> create(
@RequestBody RequestDto request) {
ResponseDto result = service.create(request);
return Mono.just(ResponseEntity.ok(result));
}
@Transactional
public ResponseDto create(RequestDto request) {
taskRepository.save(request);
return new ResponseDto("Ок");
}
这显然是由@Transactional
注解引起的。当我删除它时,警告消失了。这是什么问题?如何修复?
这个例子是示意性的。真实的的代码更大。
1条答案
按热度按时间0mkxixxg1#
React式进程与规范相反。您不能在这里使用阻塞元素!使用Tomcat,它为每个请求创建一个单独的线程,这样主题就可以被阻塞。React式Netty不会创建新的线程,只是使用一个固定的池。
对于松散的方法,您可以认为如果一个进程正在等待响应,它会将该线程的资源提供给另一个进程。如果您阻塞它,它将无法执行此操作。因此,即使使用单线程Netty,它也可以处理多个并行请求。因此,基于线程的数据存储也不能正常工作,因为另一个进程可能会干扰或修改它。因此,而是可以使用React式上下文。
有一篇文章对React性交易.我不知道它会为你解决:https://itnext.io/integrating-hibernate-reactive-with-spring-5427440607fe