当前位置: 首页 > 知识库问答 >
问题:

Spring WebFlux无法在结果中将阻塞操作切换到其他调度程序

燕经国
2023-03-14

我正在使用基于注释的Spring WebFlux(Reactor Netty)开发web服务器。这个服务器调用阻塞操作(JDBC)。我试着把每一个阻塞操作都切换到Reactor提供的‘弹性调度器’。

@RestController
@RequiredArgsConstructor
@RequestMapping("/member")
public class MemberApiRestController {
  private final MemberService memberService;

  @GetMapping("/all")
  public Mono<List<String>> findAllMembers() {
      return Mono
            .fromCallable(()->memberService.findAll())
            .map(member::toString)
            .subscribeOn(Schedulers.elastic())
            .publishOn(Schedulers.elastic())
  }
}

public class MemberService {
 public List<Member> findAll() {
     log.debug("Blocking Operation...")
     //Blocking - Operation.
 }
}

log is like ... 

2019-05-16 10:26:58,227 |-LOCAL [reactor-http-nio-7] TRACE       o.s.web.server.adapter.HttpWebHandlerAdapter:  87 - [165a3273] HTTP GET "/member/all", headers={masked}
2019-05-16 10:26:58,249 |-LOCAL [elastic-20] DEBUG                       MemberService:  36 - Blocking Operation...
2019-05-16 10:27:00,277 |-LOCAL [reactor-http-nio-7] TRACE       o.s.web.server.adapter.HttpWebHandlerAdapter:  87 - [165a3273] Completed 200 OK, headers={masked}

因为MemberService.findAll()方法是blocking-operation,所以我切换到了schedulers.elastic()。

是否可以切换响应处理程序调度程序?如果这是不可能的,我会理解为什么他们这样设计。

共有1个答案

卫乐童
2023-03-14

我的测试代码出错了。我使用RestTemplate提出了一个请求。我没有看到RestTemplate实例的工厂对象在并发中有最大请求限制。(默认情况下,最大请求为5。)。固定了最大请求数后,运行良好。

 类似资料:
  • 我正在使用Spring Webflux和Spring Boot2,我的场景如下: 在返回之前,我如何将来自流量和正常产品列表的结果连接起来?没有反应控制器是可能的吗? 附言。我不想对从调用1获得的结果调用。block()和CompleteableFuture

  • OpenResty 的诞生,一直对外宣传是同步非阻塞(100% non-blocking)的。基于事件通知的 Nginx 给我们带来了足够强悍的高并发支持,但是也对我们的编码有特殊要求。这个特殊要求就是我们的代码,也必须是非阻塞的。如果你的服务端编程生涯一开始就是从异步框架开始的,恭喜你了。但如果你的编程生涯是从同步框架过来的,而且又是刚刚开始深入了解异步框架,那你就要小心了。 Nginx 为了减

  • 下面的代码片段执行两个线程,一个是每秒记录一次的简单计时器,第二个是执行remainder操作的无限循环: 这给出了以下结果:

  • 我不能让非常基本的底拖示例按预期工作。下面的代码应该允许服务并发HTTP请求。实际发生的情况是,只有一个请求被处理,在第一个请求完成之前,其他请求都无法通过。 增加XNIO线程数及其工作线程不会改变任何事情。一个随机的XNIO被分配给请求。然后在调度后分配一个随机工作者。服务器一直处于阻塞状态,直到请求得到服务。

  • 这一节解释 BlockingObservable 的子类. 一个阻塞的Observable 继承普通的Observable类,增加了一些可用于阻塞Observable发射的数据的操作符。 要将普通的Observable 转换为 BlockingObservable,可以使用 Observable.toBlocking( )) 方法或者BlockingObservable.from( )) 方法。

  • 本文向大家介绍svn 将工作副本切换到其他分支,包括了svn 将工作副本切换到其他分支的使用技巧和注意事项,需要的朋友参考一下 示例 可以快速转换现有的工作副本以反映同一存储库中不同分支的内容。例如,您可能有主干的工作副本,现在需要在开发分支上工作。您可以使用以下svn switch命令来有效地修改现有的工作副本,而不必检出一个全新的工作副本(这会浪费大量时间和磁盘空间): 现在,您的工作副本将反