如何在不阻塞的情况下从 Spring Webflux 中的 Mono 对象中提取数据?

Posted

技术标签:

【中文标题】如何在不阻塞的情况下从 Spring Webflux 中的 Mono 对象中提取数据?【英文标题】:How to extract data from a Mono object in Spring Webflux without blocking? 【发布时间】:2021-01-28 22:10:58 【问题描述】:

我正在使用 Postman 向我的 Spring 应用程序发送一个 POST 请求。该请求的 JSON 正文如下所示:


        "documents": [
            
                "id": "1",
                "text": "Piece of text 1",
                "lang": "en"
            ,
            
                "id": "2",
                "text": "Piece of text 2",
                "lang": "en"
            
        ],
        "domain": "hr",
        "text_key": "text"
    

我设置了一个方法来处理这些 POST 请求,并且我需要能够从请求正文中提取上述 JSON 数据而不会阻塞。我现在的方法看起来像这样:

public void requestBody(ServerRequest request) 


      Mono<String> bodyData = request.bodyToMono(String.class);

      System.out.println("\nsubscribing to the Mono.....");

      bodyData.subscribeOn(Schedulers.newParallel("requestBody")).subscribe(value -> 
        log.debug(String.format("%n value consumed: %s" ,value));
      );


但是,这无济于事。我尝试查看Spring Reactive get body JSONObject using ServerRequest 中的答案 和 Getting String body from Spring serverrequest 但无济于事。请帮忙。


Update #1

感谢https://***.com/users/1189885/chrylis-cautiouslyoptimistic

根据您的回答,这就是我正在尝试的:

    request.bodyToMono(String.class).map(
        (String rqBody) -> 
          setRequestBody(rqBody);
          return ServerResponse.status(HttpStatus.CREATED).contentType(APPLICATION_JSON).body(rqBody, Object.class);
        
      );


setRequestBody() 正在设置一个全局字符串变量作为请求正文。像这样:


  public void setRequestBody (String rqBody)
    System.out.println("\nset request body called with: " + rqBody);
    request_body=rqBody;
  

但是,全局 request_body 变量仍然为空。


Update #2

根据您的最新评论,这就是我正在尝试做的事情:



    RedissonClient redisson = Redisson.create();

    RBucket<Object> bucket = redisson.getBucket("requestKey");

      request.bodyToMono(String.class).doOnNext(
        (String rqBody) -> 
          bucket.set(rqBody);
        
      );

当我进入 Redis-cli 并尝试get requestKey 时,它给了我nil

【问题讨论】:

【参考方案1】:

不能;这就是反应模型的全部含义。相反,您通常应该使用map(通过应用函数来修改值)或doOnNext(采取一些行动但不返回结果)之类的操作。

如果使用响应式执行模型,例如 Spring WebFlux,您可以直接从控制器方法中返回 Mono&lt;Whatever&gt;,然后 Spring 会为您“提取”数据。

【讨论】:

你能看看我的后续问题吗,我已经把它作为这个问题的另一个答案发布了。

以上是关于如何在不阻塞的情况下从 Spring Webflux 中的 Mono 对象中提取数据?的主要内容,如果未能解决你的问题,请参考以下文章

在不阻塞 dom 的情况下从后端渲染 ($compile) html 到视图中

Spring,如何在不使用附加转换器的情况下从字符串返回XML响应?

如何在不使用 sudo 的情况下从终端窗口关闭 Internet 连接?

如何在不更改顺序的情况下从 plist 加载数据

如何在不传递委托的情况下从 RootViewController 调用 AppDelegate 方法?

如何在不提供 C# 管理员凭据的情况下从标准用户启动进程