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

第十九节:学习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.mrgr.cn/news/30857.html

相关文章:

  • 计算机网络:运输层 —— 运输层端口号
  • 苍穹外卖 数据可视化
  • Unity3D ASTC贴图压缩格式详解
  • 微信小程序获取上一页的数据
  • Transformer(三):论文 Attention Is All You Need
  • HTMLCSS: 日落卡片
  • 平价头戴式蓝牙耳机有哪些?四款公认平价性能超强品牌机型推荐
  • 第六天旅游线路预览——从景区门口到天山天池
  • JavaScript可视化
  • 【Unity踩坑】UI Image的fillAmount不起作用
  • 创新的护盾:知识产权、商标与软件著作权的全方位解读
  • 【QGIS】(六)对图层添加属性并赋值行号(可作为导入数据的主键使用)
  • 大厂常问的MySQL事务隔离到底怎么回答
  • LabVIEW闪退
  • AutoX.js向后端传输二进制数据
  • js 深入理解类-class
  • Python数据处理入门教程!
  • 低侧单向电流、单电源检测电路
  • Redis系列---Redission分布式锁
  • 深度学习激活函数
  • 力扣560 和为k的子数组 Java版本
  • CCRC-CDO首席数据官:未成年人首次上网年龄持续降低
  • vmware官网下载
  • 企业如何使用数据分析管理系统
  • 数据类型转换工具类(字符串和int、double、long等数字类型互相转换)
  • C#_封装详解