spring-boot - 在 Spring Webflux Annotated 控制器中的不同线程中运行任务
问题描述
我有一个 Spring Webflux Annotated 控制器,如下所示,
@RestController
public class TestBlockingController {
Logger log = LoggerFactory.getLogger(this.getClass().getName());
@GetMapping()
public Mono<String> blockForXSeconds(@RequestParam("block-seconds") Integer blockSeconds) {
return getStringMono();
}
private Mono<String> getStringMono() {
Integer blockSeconds = 5;
String type = new String();
try {
if (blockSeconds % 2 == 0) {
Thread.sleep(blockSeconds * 1000);
type = "EVEN";
} else {
Thread.sleep(blockSeconds * 1000);
type = "ODD";
}
} catch (Exception e) {
log.info("Got Exception");
}
log.info("Type of block-seconds: " + blockSeconds);
return Mono.just(type);
}
}
如何让 getStringMono 在与 Netty 服务器线程不同的线程中运行。我面临的问题是,当我在服务器线程中运行时,吞吐量基本上会减少(每秒 2 个请求)。如何在单独的线程中运行 getStringMono。
解决方案
您可以使用subscribeOn
运算符将任务委托给不同的线程池:
Mono.defer(() -> getStringMono()).subscribeOn(Schedulers.elastic());
不过,您必须注意,在响应式应用程序中应不惜一切代价避免这种类型的阻塞。如果可能,请使用支持非阻塞 IO 并返回承诺类型(Mono、CompletableFuture 等)的客户端。如果您只是想人为延迟,请Mono.delay
改用。
推荐阅读
- python - How to clean up captcha image?
- linux - 如何设置 EGL 默认显示?
- javascript - Express.js sometimes passes the router
- php - 为什么不编辑 .htaccess 文件?
- python - How train the pytorch model with another freeze model?
- testing - Your role configuration do not allow you Assign Roles for Test Plans : Testlink Error
- javascript - JS expression to calculate the average value of all given data points within a month, for all months represented in the data points
- amazon-web-services - Configure email for AWS lightsail cpanel and Godaddy registered domain
- python-3.x - How do I write into a CSV file without removing anything in it in Python?
- python-3.x - can not drawing decision tree with tree.export_text(clf)