首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >webflux中的异步请求不是异步请求

webflux中的异步请求不是异步请求
EN

Stack Overflow用户
提问于 2021-04-01 22:44:46
回答 1查看 358关注 0票数 0

我想让我的请求触发一些长时间运行的动作,这些动作应该在后台执行。我写了以下实现,它应该在后台处理我的操作,但实际上我的请求是同步执行的:

代码语言:javascript
复制
    @AsyncTimeout(10 * 60 * 1000)
    @PostMapping("/dosomething")
    Mono<Void> doSomething() {
        return Mono.defer(() -> delay()).subscribeOn(Schedulers.elastic());
    }

    public static Mono<Void> delay() {
        return Mono.fromRunnable(() -> {
            LOG.info("Started sleep");
            Uninterruptibles.sleepUninterruptibly(10, TimeUnit.SECONDS);
            LOG.info("Finished sleep");
        });
    }

在日志中,我看到以下内容:

代码语言:javascript
复制
14:29:58.801 DEBUG 1 --- [p1491676195-768] Incoming request for POST http://localhost:8989/dosomething
14:29:58.802  INFO 1 --- [      elastic-6] Started sleep
14:30:08.803  INFO 1 --- [      elastic-6] Finished sleep
14:30:08.806 DEBUG 1 --- [p1491676195-655] Outgoing response for POST http://localhost:8989/dosomething: 200

我看到我的sleep是在另一个线程中执行的,但是由于某种原因,我的原始请求等待睡眠完成

更新1:

代码语言:javascript
复制
    @PostMapping("/dosomething")
    Mono<Void> doSomething() {
        return Mono.defer(() -> {
            delay().subscribe();
            return Mono.empty();
        });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-02 01:58:02

根据我读到的评论,以及我对您的担忧的理解,如果您希望运行阻塞调用,但在后台运行它,同时立即返回对服务调用的响应,您可以简单地将subscribeOn添加到该进程中,在您的示例中是delay()。这将使它在不同的线程中运行:

代码语言:javascript
复制
@PostMapping("/dosomething")
    Mono<Void> doSomething() {
        return Mono.defer(() -> {
            delay().subscribeOn(Schedulers.boundedElastic()).subscribe();
            return Mono.empty();
        });

此链接可能与您的问题有关:https://projectreactor.io/docs/core/release/reference/#faq.wrap-blocking

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66906666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档