我试图了解反应式编程是如何工作的。我为此准备了简单的演示:WebClient来自 Spring Framework 的 reactive 将请求发送到简单的 rest api,并且此客户端在每个操作中打印线程名称。
休息API:
@RestController
@SpringBootApplication
public class RestApiApplication {
public static void main(String[] args) {
SpringApplication.run(RestApiApplication.class, args);
}
@PostMapping("/resource")
public void consumeResource(@RequestBody Resource resource) {
System.out.println(String.format("consumed resource: %s", resource.toString()));
}
}
@Data
@AllArgsConstructor
class Resource {
private final Long id;
private final String name;
}
问题是行为与我预期的不同。
.map()我预计,.filter()和 的每次调用都.flatMap()将在线程上执行,而ormain的每次调用都将在 nio 线程池中的线程上执行。所以我希望日志看起来像:.doOnSuccess().doOnError
------- map [main] --------
------- filter [main] --------
------- flatmap [main] --------
(and so on...)
------- onsuccess [reactor-http-nio-2] --------
(and so on...)
但我得到的日志是:
------- map [main] --------
------- filter [main] --------
------- flatmap [main] --------
------- map [main] --------
------- filter [main] --------
------- flatmap [main] --------
------- onsuccess [reactor-http-nio-2] --------
------- onsuccess [reactor-http-nio-6] --------
------- onsuccess [reactor-http-nio-4] --------
------- onsuccess [reactor-http-nio-8] --------
------- map [reactor-http-nio-2] --------
------- filter [reactor-http-nio-2] --------
------- flatmap [reactor-http-nio-2] --------
------- map [reactor-http-nio-2] --------
每次下一次登录.map(),.filter()都是.flatMap()在 reactor-http-nio 的线程上完成的。
下一个难以理解的事实是在主线程和 reactor-http-nio 上执行的操作之间的比率总是不同的。有时所有操作.map(),.filter()和.flatMap()都在主线程上执行。
慕桂英546537
相关分类