日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

使用webflux提升数据导出效率

發(fā)布時(shí)間:2025/3/18 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用webflux提升数据导出效率 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??

本文主要研究一下如何使用webflux提升數(shù)據(jù)導(dǎo)出效率

傳統(tǒng)導(dǎo)出

@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);}

這里模擬的是等所有數(shù)據(jù)都準(zhǔn)備好了再導(dǎo)出,這種速度肯定慢,差不多需要等待100秒瀏覽器才能彈出下載框,如果前面有網(wǎng)關(guān),很容易在網(wǎng)關(guān)那里超時(shí)了

webflux導(dǎo)出

@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)方法,實(shí)現(xiàn)邊準(zhǔn)備數(shù)據(jù)邊導(dǎo)出 等待十幾秒就彈下載框,之后就server端一邊輸出,瀏覽器一邊下載,100秒左右下載完畢

小結(jié)

兩種方法目前看來(lái)用時(shí)差不多,不過(guò)后者可以避免超時(shí)。當(dāng)然使用傳統(tǒng)mvc也可以實(shí)現(xiàn)類(lèi)似效果,就是拿到response的輸出流不斷地write和flush。不過(guò)webflux可以配合reactive的repository,實(shí)現(xiàn)端到端的reactive stream,同時(shí)也可以避免OOM。

轉(zhuǎn)載于:https://my.oschina.net/go4it/blog/1621396

與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的使用webflux提升数据导出效率的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。