使用webflux提升数据导出效率
2018-02-11 00:00
162 查看
序
本文主要研究一下如何使用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 row sink.next(stringBuffer(ExcelUtil.writeTitleRow(Sets.newHashSet("title","content")))); //write data row IntStream.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。相关文章推荐
- 使用SPRY框架,提升Web开发效率
- net控件中数据导到Excel的格式 首先,我们了解一下excel从web页面上导出的原理。当我们把这些数据发送到客户端时,我们想让客户端程序(浏览器)以excel的格式读取它,所以把mime类型设为:application/vnd.ms-excel,当excel读取文件时会以每个cell的格式呈现数据,如果cell没有规定的格式,则excel会以默认的格式去呈现该cell的数据。这样就给我们提供了自定义数据格式的空间,当然我们必须使用excel支持的格式。下面就列出常用的一些格式: 1) 文本
- 在WebGL应用中使用Web Worker提升效率
- 使用UltraWebGridExcelExporter控件导出分页Grid所有数据的简单解决办法
- 关于Java Web 使用 POI 将 数据库表 导出 Excel 的完整实例
- 使用forall与bulk collect 提升数据割接效率
- 逐浪技术堂:FarmVet Systems 使用 SQL Server 与 Visual Studio 开发移动数据应用,提升农场兽医效率
- Qt插入大量数据到sqlite数据库,使用事务提升效率(效率提高的惊人)
- 使用Web.Config/Maching.Config保存常用数据
- 使用DTS导出到Access,FoxPro,Word ,Excel 不需要验证的大批量数据。
- 使用Quest Central导入导出数据教程
- powerbuilder使用导入导出表数据
- 在使用中文名导出数据到excel文件时文件名出现乱码的解决办法
- 如何使用VB调用DTS进行数据的导入、导出
- 使用ORM中间件提升软件开发效率及质量
- [导入]使用ORM中间件提升软件开发效率及质量
- 使用httpwebrequest发送数据到网站
- 使用对象-关系映射(ORM)系统中间件提升软件开发效率及质量
- 用C#使用HttpWebRequest Post数据时如何保持Session
- 使用sql脚本把数据导出为.txt文件