为什么80%的码农都做不了架构师?>>>   

本文主要研究一下如何使用webflux提升数据导出效率

传统导出

    @GetMapping("/download-old")public ResponseEntity<Resource> downloadInOldWays(){return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=demo.xls").header("Accept-Ranges", "bytes").body(new ByteArrayResource(exportBytes(1000)));}public byte[] exportBytes(int dataRow){StringBuilder output = new StringBuilder();output.append(ExcelUtil.startWorkbook());output.append(ExcelUtil.startSheet());output.append(ExcelUtil.startTable());output.append(ExcelUtil.writeTitleRow(Sets.newHashSet("title","content")));IntStream.rangeClosed(1,dataRow).forEach(i -> {try {TimeUnit.MILLISECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}output.append(ExcelUtil.writeDataRow(Lists.newArrayList("title"+i,"content"+i)));});output.append(ExcelUtil.endTable());output.append(ExcelUtil.endSheet());output.append(ExcelUtil.endWorkbook());return output.toString().getBytes(StandardCharsets.UTF_8);}

这里模拟的是等所有数据都准备好了再导出,这种速度肯定慢,差不多需要等待100秒浏览器才能弹出下载框,如果前面有网关,很容易在网关那里超时了

webflux导出

    @GetMapping("/download")public Mono<Void> downloadByWriteWith(ServerHttpResponse response) throws IOException {response.getHeaders().set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=demo.xls");response.getHeaders().add("Accept-Ranges", "bytes");Flux<DataBuffer> flux = excelService.export(1000);return response.writeWith(flux);}public Flux<DataBuffer> export(int dataRow){return Flux.create(sink -> {sink.next(stringBuffer(ExcelUtil.startWorkbook()));sink.next(stringBuffer(ExcelUtil.startSheet()));sink.next(stringBuffer(ExcelUtil.startTable()));//write title rowsink.next(stringBuffer(ExcelUtil.writeTitleRow(Sets.newHashSet("title","content"))));//write data rowIntStream.rangeClosed(1,dataRow).forEach(i -> {try {TimeUnit.MILLISECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}sink.next(stringBuffer(ExcelUtil.writeDataRow(Lists.newArrayList("title"+i,"content"+i))));});sink.next(stringBuffer(ExcelUtil.endTable()));sink.next(stringBuffer(ExcelUtil.endSheet()));sink.next(stringBuffer(ExcelUtil.endWorkbook()));sink.complete();});}

这里使用ReactiveHttpOutputMessage的writeWith(Publisher<? extends DataBuffer> body)方法,实现边准备数据边导出 等待十几秒就弹下载框,之后就server端一边输出,浏览器一边下载,100秒左右下载完毕

小结

两种方法目前看来用时差不多,不过后者可以避免超时。当然使用传统mvc也可以实现类似效果,就是拿到response的输出流不断地write和flush。不过webflux可以配合reactive的repository,实现端到端的reactive stream,同时也可以避免OOM。

转载于:https://my.oschina.net/go4it/blog/1621396

使用webflux提升数据导出效率相关推荐

  1. 神策数据推动安信证券落地埋点地图,提升数据建设效率与质量

    数字经济时代,数据愈发重要,对于走在数字化转型前列的证券行业尤其如此.作为证券企业数据应用的基础,数据质量不容忽视,其好坏直接影响使用价值的高低.在数字化转型的大背景下,越来越多的证券企业通过数字化工 ...

  2. 鸿翼归档:释放企业存储压力 提升数据利用效率

    随着大数据.物联网.互联网+等新兴信息技术的蓬勃发展而产生的海量数据,正在重塑市场对数据处理和存储容量的需求,如谷歌.微软.亚马逊以及阿里巴巴等均在寻求新的业务模式,旨在适应数字化时代的海量数据.鸿翼 ...

  3. 交通行业提升数据利用效率的核心是做好数据交换与共享

    近年来,政策环境的持续优化让数据红利在交通行业加速释放,比如:2016年,交通运输部部署了综合交通运输大数据应用中心建设工作,同时也委托交通运输部交科院开展综合交通运输大数据政策标准研究等任务: 20 ...

  4. 数据导出组件Data-Export:数据分析处理“加速器”

    数据治理通用组件WeBankBlockchain-Data当前的3个子组件--数据仓库组件Data-Stash.数据导出组件Data-Export.数据对账组件Data-Reconcile,相互独立. ...

  5. 【观察】后疫情时代,数据中心效率与成本的“平衡术”

    申耀的科技观察 读懂科技,赢取未来! 今年疫情期间,我们可以看到大量的创新技术应用到实际场景之中,以及包括远程办公.在线教育.在线医疗等新需求快速的涌现,无疑都极大的加速了企业数字化转型的步伐. 这些 ...

  6. python xlwings追加数据_大数据分析Python库xlwings提升Excel工作效率教程

    原标题:大数据分析Python库xlwings提升Excel工作效率教程 Excel在当今的企业中非常非常普遍.在AAA教育,我们通常建议出于很多原因使用代码,并且我们的许多数据科学课程旨在教授数据分 ...

  7. 如何分析业务报表数据口径,明确指标的标准定义,建立指标字典及查询渠道,提升数据提取加工效率...

    分析业务报表数据的口径: 明确数据源:确定报表数据来源,验证数据的完整性和准确性. 核查数据定义:核对指标的定义与数据的对应关系,确保数据的一致性. 统一指标标准:明确指标的标准定义,统一数据的表示方 ...

  8. 油气大数据平台建设案例分享,让油田数据同步效率提升20%的解决方案

    你知道吗?石油探测生产,其实也是一个需要经过大量数据的分析计算才能实现的工作.早在60多年前,大庆油田的建设者们,就需要经过多达160万次的分析化验和超千万次的地层对比,才能完成地下石油分布的探查. ...

  9. Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725

    Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓  O725 1. DSL主要分为三类:外部DSL.内部DSL,以及语言工作台. 1 2. DSL ...

最新文章

  1. 探索JAVA并发 - 悲观锁和乐观锁
  2. python 虚拟环境依赖复制
  3. CircleDisplay
  4. There was a problem confirming the ssl certificate
  5. 几点易被忽视的网络软故障排查
  6. 剑破冰山—Oracle开发艺术 前言
  7. Python中的del用法
  8. 物理学家杨振宁到底有多厉害?
  9. SQLPlus命令详细说明
  10. iOS开发那些事-iOS常用设计模式–委托模式案例实现
  11. 玩游戏计算机丢失msvcp,Win10系统玩吃鸡提示游戏缺少msvcp140.dll的解决方法
  12. 多线程 简单的实现案例
  13. 用EasyRecovery“监控硬盘”功能检测硬盘问题的方法
  14. LNMP 一键安装脚本阅读
  15. USDA土壤粒径分布图及韦恩图在线绘制-USDA_Soil_Texture_Calculator soil textual triangle
  16. ESP8266-Arduino编程实例-SHT20温湿度传感器驱动
  17. MacOS中的剪切快捷键
  18. STM32 Combined PWM的用法
  19. NRF24L01的多对一通信
  20. 聚类算法——kmeans和meanshift

热门文章

  1. Docker中部署mysql数据库
  2. MybatisPlus提示 Could not set property 'id' of '***' with value
  3. 【TensorFlow】笔记1:入门笔记
  4. flutter开发之必须掌握的dart知识点:list,set,map
  5. 冒泡排序的原理,思路,以及算法分析(Java实现)
  6. 17、mybatis两个内置参数
  7. Java如何让小球随机运动_用java模拟两球的随机运动及碰撞
  8. win7 php mysql扩展名_win7下MySQL 5.1.73安装过程(图解)并在php.ini中启用相关扩展。...
  9. 赛程一览 | 2019 上海国际创客大赛
  10. 短融网杨夏耘:数据如何驱动金融科技业务升级?