当前位置: 首页 > article >正文

第十九节:学习WebFlux与前端响应式-非阻塞-流式通讯(自学Spring boot 3.x的第四天)

这节记录下如何使用Springboot中的WebFlux的Mono和Flux实现后台向前端的数据传输。

适用场景:需要向某个url请求数据,但是对方url返回的是流式数据,异步的。这个时候传统的restful响应已经不适用了,需要用到webclient来进行处理,而WebFlux刚好集成了webclient。

在webclient中,有2种重要的数据结构,一个是Mono,一个是Flux。

Mono适合一次性数据,而Flux适合多次数据。这样的话,其实就是说:Flux适用于流式数据传输。

为了节省篇幅,本篇主要讲Flux使用方法,Mono和Flux使用方法基本一致。

第一步:

先在pom中集成webflux所需要的依赖库。

 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-webflux -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
            <version>3.3.3</version>
        </dependency>

第二步:

Controller层


    /**
     * 通过返回Flux<String>>实现非阻塞异步请求,优先此方法
     * 通过此方法向客户端发送字符串
     * @param messageId
     * @return
     * @throws IOException
     */
    @GetMapping("/chatsse")
    public Flux<String> chatSSE(@RequestParam String messageId) throws IOException {
            return articleService.sendMessage(content);
    }

第三步:

Service层:

public Flux<String> sendMessage(String prompt) throws IOException {


        return webClient.post()
                .uri(xxx)
                .body(BodyInserters.fromValue(jsonStr))
                .retrieve()
                .bodyToFlux(DataBuffer.class)
                .map(response -> {
                    try {
                        return "测试";
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                });
    }

上面代码可以实现向客户端发送流式数据。

代码分析:

上面的webClient.post返回的是一个Flux<String>对象,如果要实时处理数据的话,可以调用它的subscribe和doNext方法,不过这2个都不会影响真实的数据传输结果,只能作为调试使用。(个人理解,不一定正确)。也就是说不管你在这里面写的天花地坠,传输给前端的数据不会改变。传输的。

仅观察数据,不对数据本身起到影响怎么做?可以用doNext或者订阅方法subscribe。

例如:下面的doNext方法可以用于调试观察数据。

      .map(response -> {
                    try {
                        return extractResponse(response);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                })
                 .doOnNext(s->{
                    System.out.println(s);
                });

怎么对传输的流数据进行处理?关键看map方法。

如果要进行数据处理,得先告知flux返回的对象,.需要用到bodyToFlux(DataBuffer.class)。

其次再使用map进行数据转换。把DataBuffer转换为了String。下面的response对象跟bodyToFlux(DataBuffer.class)有关系,这里声明的是DataBuffer,所以response在这里实际上是DataBuffer对象。可以在map方法里使用各种各样的方式处理数据流。

      .map(response -> {
                    try {
                        return extractResponse(response);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                });//调用这个函数会自动输出,而且仅执行一次


http://www.kler.cn/news/314132.html

相关文章:

  • Java操控Redis (面经之 使用Redis)
  • 【HTTP】构造HTTP请求和状态码
  • [译] Go语言的源起,发展和未来
  • Rust语言入门第七篇-控制流
  • Highcharts甘特图基本用法(highcharts-gantt.js)
  • 安装黑群晖系统,并使用NAS公网助手访问教程(好文)
  • 【系统架构设计师】虚拟机架构风格
  • 十五、差分输入运算放大电路
  • C++——模板初阶
  • 网页聊天——测试报告——Selenium自动化测试
  • 分类预测|2024年最新优化算法鹦鹉优化器PO|基于鹦鹉优化SVM支持向量机数据分类预测Matlab程序PO-SVM
  • 2024年9月python二级易错题和难题大全(附详细解析)(五)
  • allWebPlugin中间件自定义alert、confirm及prompt使用
  • 力扣1143-最长公共子序列(Java详细题解)
  • 分布式光伏发电系统如何确保电能质量达到并网要求?
  • Tiny-universe学习笔记1:Qwen-blog
  • 数据飞轮:打造业务增长的持续循环
  • C++——string的了解和使用
  • 相见恨晚的一本书《纳瓦尔宝典:财富与幸福指南》
  • 内网渗透- 内网渗透的基本知识
  • 【物联网】时序数据库InfluxDB解析及1.x版本与2.x版本区别详解
  • Docker 笔记
  • java计算字符串中大写字母的个数
  • 30道常见的软件测试面试题(含答案+文档)
  • 【若依框架】按时间查询数据的操作
  • VScode 使用Code Runner 运行输出控制台中文乱码解决
  • Qt中的延时
  • 基于TCP实现聊天
  • Spring中的Web Service消费者集成(应该被淘汰的技术)
  • c++实现类