日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

一起聊聊基于隊列實現(xiàn)多人同時導(dǎo)出 Excel

來源: 責(zé)編: 時間:2024-05-07 09:08:35 241觀看
導(dǎo)讀前言業(yè)務(wù)訴求:考慮到數(shù)據(jù)庫數(shù)據(jù)日漸增多,導(dǎo)出會有全量數(shù)據(jù)的導(dǎo)出,多人同時導(dǎo)出可以會對服務(wù)性能造成影響,導(dǎo)出涉及到mysql查詢的io操作,還涉及文件輸入、輸出流的io操作,所以對服務(wù)器的性能會影響比較大;結(jié)合以上原因,對導(dǎo)出

前言

業(yè)務(wù)訴求:考慮到數(shù)據(jù)庫數(shù)據(jù)日漸增多,導(dǎo)出會有全量數(shù)據(jù)的導(dǎo)出,多人同時導(dǎo)出可以會對服務(wù)性能造成影響,導(dǎo)出涉及到mysql查詢的io操作,還涉及文件輸入、輸出流的io操作,所以對服務(wù)器的性能會影響比較大;結(jié)合以上原因,對導(dǎo)出操作進行排隊;
剛開始拿到這個需求,第一時間想到就是需要維護一個FIFO先進先出的隊列,給定隊列一個固定size,在隊列里面的人進行排隊進行數(shù)據(jù)導(dǎo)出,導(dǎo)出完成后立馬出隊列,下一個排隊的人進行操作;還考慮到異步,可能還需要建個文件導(dǎo)出表,主要記錄文件的導(dǎo)出情況,文件的存放地址,用戶根據(jù)文件列表情況下載導(dǎo)出文件。

業(yè)務(wù)關(guān)系定義

分別是用戶、導(dǎo)出隊列、導(dǎo)出執(zhí)行方法

  • ExportQueue: 維護一條定長隊列,可以獲取隊列里前后排隊的用戶,提供查詢,隊列如果已經(jīng)滿了,其余的人需要進行等待
  • User信息: 排隊執(zhí)行導(dǎo)出方法對應(yīng)用戶;
  • Export類: 定義導(dǎo)出方法,異步執(zhí)行,用戶可以通過導(dǎo)出頁面查看、下載,導(dǎo)出的文件;

圖片圖片uin28資訊網(wǎng)——每日最新資訊28at.com

具體代碼實現(xiàn)

ExportQueue隊列

package com.example.system.config;import com.example.system.api.domain.ExportUser;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;import java.util.LinkedList;@Slf4j@Componentpublic class ExportQueue {    private final int MAX_CAPACITY = 10; // 隊列最大容量    private LinkedList<ExportUser> queue; // 用戶隊列    public ExportQueue(LinkedList<ExportUser> queue) {        this.queue = new LinkedList<>();    }    /**     * 排隊隊列添加     * @param sysUser     */    public synchronized LinkedList<ExportUser> add(ExportUser sysUser) {        while (queue.size() >= MAX_CAPACITY) {            try {                log.info("當(dāng)前排隊人已滿,請等待");                wait();            } catch (InterruptedException e) {                e.getMessage();            }        }        queue.add(sysUser);        log.info("目前導(dǎo)出隊列排隊人數(shù):" + queue.size());        notifyAll();        return queue;    }    /**     * 獲取排隊隊列下一個人     * @return     */    public synchronized ExportUser getNextSysUser() {        while (queue.isEmpty()) {            try {                wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        ExportUser sysUser = queue.remove();        notifyAll(); //喚醒        return sysUser;    }}

AbstractExport導(dǎo)出類

引入EasyExcel百萬級別的導(dǎo)出功能uin28資訊網(wǎng)——每日最新資訊28at.com

package com.example.system.config;import cn.hutool.core.bean.BeanUtil;import cn.hutool.core.util.PageUtil;import com.alibaba.excel.EasyExcel;import com.alibaba.excel.ExcelWriter;import com.alibaba.excel.write.metadata.WriteSheet;import com.example.system.api.domain.ExportUser;import lombok.extern.slf4j.Slf4j;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.net.URLEncoder;import java.util.List;@Slf4jpublic abstract class AbstractExport<T, K> {    public abstract void export(ExportUser sysUser) throws InterruptedException;    /**     * 導(dǎo)出     *     * @param response 輸出流     * @param pageSize 每頁大小     * @param t        導(dǎo)出條件     * @param k        Excel內(nèi)容實體類     * @param fileName 文件名稱     */    public void export(HttpServletResponse response, int pageSize, T t, Class<K> k, String fileName) throws Exception {        ExcelWriter writer = null;        try {            writer = getExcelWriter(response, fileName);            //查詢導(dǎo)出總條數(shù)            int total = this.countExport(t);            //頁數(shù)            int loopCount = PageUtil.totalPage(total, pageSize);            BeanUtil.setProperty(t, "pageSize", pageSize);            for (int i = 0; i < loopCount; i++) {                //開始頁                BeanUtil.setProperty(t, "pageNum", PageUtil.getStart(i + 1, pageSize));                //獲取Excel導(dǎo)出信息                List<K> kList = this.getExportDetail(t);                WriteSheet writeSheet = EasyExcel.writerSheet(fileName).head(k).build();                writer.write(kList, writeSheet);            }        } catch (Exception e) {            String msg = "導(dǎo)出" + fileName + "異常";            log.error(msg, e);            throw new Exception(msg + e);        } finally {            if (writer != null) {                writer.finish();            }        }    }    public com.alibaba.excel.ExcelWriter getExcelWriter(HttpServletResponse response, String fileName) throws IOException {        response.setContentType("application/vnd.ms-excel");        response.setCharacterEncoding("utf-8");        // 這里URLEncoder.encode可以防止中文亂碼 當(dāng)然和easyexcel沒有關(guān)系        String fileNameUtf = URLEncoder.encode(fileName, "UTF-8").replaceAll("http://+", "%20");        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileNameUtf + ".xlsx");        return EasyExcel.write(response.getOutputStream()).build();    }    /**     * (模版導(dǎo)出)     *     * @param t     * @param fileName     * @param response     */    public abstract void complexFillWithTable(T t, String fileName, HttpServletResponse response);    /**     * 查詢導(dǎo)出總條數(shù)     *     * @param t     * @return     */    public abstract int countExport(T t);    /**     * 查詢導(dǎo)出數(shù)據(jù)     *     * @param t     * @return     */    public abstract List<K> getExportDetail(T t);}

ExportImpl導(dǎo)出實現(xiàn)方法

package com.example.system.service.impl;import com.alibaba.excel.ExcelWriter;import com.example.system.api.domain.ExportUser;import com.example.system.config.AbstractExport;import com.example.system.config.ExportQueue;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.util.LinkedList;import java.util.List;@Service@Slf4jpublic class ExportImpl extends AbstractExport {    @Autowired    private ExportQueue exportQueue;    @Override    public void export(ExportUser sysUser) throws InterruptedException {        //導(dǎo)出        log.info("導(dǎo)出文件方法執(zhí)行~~~~~~~~~");//        export(response,pageSize,t,k,fileName);        LinkedList<ExportUser> queue = exportQueue.add(sysUser);        log.info("導(dǎo)出隊列:" + queue);        //休眠時間稍微設(shè)置大點,模擬導(dǎo)出處理時間        Thread.sleep(20000);        //導(dǎo)出成功后移除當(dāng)前導(dǎo)出用戶        ExportUser nextSysUser = exportQueue.getNextSysUser();        log.info("移除后獲取下一個排隊的用戶: " + nextSysUser.getUserName());    }    @Override    public void export(HttpServletResponse response, int pageSize, Object o, Class k, String fileName) throws Exception {        super.export(response, pageSize, o, k, fileName);    }    @Override    public ExcelWriter getExcelWriter(HttpServletResponse response, String fileName) throws IOException {        return super.getExcelWriter(response, fileName);    }    @Override    public void complexFillWithTable(Object o, String fileName, HttpServletResponse response) {    }    @Override    public int countExport(Object o) {        return 0;    }    @Override    public List getExportDetail(Object o) {        return null;    }}

測試controller

package com.example.system.controller;import com.example.system.api.domain.ExportUser;import com.example.system.api.domain.SysUser;import com.example.system.service.impl.ExportImpl;import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/export")@Slf4jpublic class ExportController {    @Autowired    private ExportImpl export;    @PostMapping("/exportFile")    public void exportFile() {            new Thread(new Runnable() {                @SneakyThrows                @Override                public void run() {                    Thread thread1 = Thread.currentThread();                    ExportUser sysUser =new ExportUser();                    sysUser.setUserName(thread1.getName());                    export.export(sysUser);                }            }).start();        }}

測試結(jié)果

通過請求測試方法,限制了我們導(dǎo)出隊列最大限制10次,隊列場長度超過10次則無法進行繼續(xù)提交;uin28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片uin28資訊網(wǎng)——每日最新資訊28at.com

第一次請求和第二次請求,間隔10秒,第一個用戶導(dǎo)出完成后出列,下一個排隊用戶在隊列首位,再進行導(dǎo)出請求排在上一個用戶后面;uin28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片uin28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

其余的還未實現(xiàn),導(dǎo)出文件的表的設(shè)計、oss文件上傳、用戶導(dǎo)出文件下載,還有高并發(fā)的場景下會不會出現(xiàn)什么問題,這些都還沒有太考慮進去; 實現(xiàn)的方式應(yīng)該挺多的,Redis的隊列應(yīng)該也是可以的,這里僅僅提供一個實現(xiàn)思路;


uin28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-86985-0.html一起聊聊基于隊列實現(xiàn)多人同時導(dǎo)出 Excel

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 新鮮出爐,截止到2024年5月最火爆的幾個前端開源庫

下一篇: 幻方發(fā)布全球最強MOE大模型! DeepSeek-V2

標(biāo)簽:
  • 熱門焦點
  • Find N3入網(wǎng):最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經(jīng)正式入網(wǎng),型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • K60至尊版剛預(yù)熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛?cè)缁鹑巛钡男麄髁薑60 Ultra的各種技術(shù)和硬件配置,作為競品的一加也坐不住了。一加中國區(qū)總裁李杰發(fā)布了兩條微博,表示在自家的一加Ace2上早就已經(jīng)采用了和PixelWo
  • 直屏旗艦來了 iQOO 12和K70 Pro同臺競技

    旗艦機基本上使用的都是雙曲面屏幕,這就讓很多喜歡直屏的愛好者在苦等一款直屏旗艦,這次,你們等到了。據(jù)博主數(shù)碼閑聊站帶來的最新爆料稱,Redmi下代旗艦K70 Pro和iQOO 12兩款手
  • 7月安卓手機性價比榜:努比亞+紅魔兩款新機入榜

    7月登場的新機有努比亞Z50S Pro和紅魔8S Pro,除了三星之外目前唯二的兩款搭載超頻版驍龍8Gen2處理器的產(chǎn)品,而且努比亞和紅魔也一貫有著不錯的性價比,所以在本次的性價比榜單
  • 學(xué)習(xí)JavaScript的10個理由...

    作者 | Simplilearn編譯 | 王瑞平當(dāng)你決心學(xué)習(xí)一門語言的時候,很難選擇到底應(yīng)該學(xué)習(xí)哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • JVM優(yōu)化:實戰(zhàn)OutOfMemoryError異常

    一、Java堆溢出堆內(nèi)存中主要存放對象、數(shù)組等,只要不斷地創(chuàng)建這些對象,并且保證 GC Roots 到對象之間有可達(dá)路徑來避免垃 圾收集回收機制清除這些對象,當(dāng)這些對象所占空間超過
  • 騰訊蓋樓,字節(jié)拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之&ldquo;想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗嗎?一起上晶核,即刻暴打!&rdquo;曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 8月見!小米MIX Fold 3獲得3C認(rèn)證:支持67W快充

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都得到了不少爆料,而小米新一代折疊屏旗艦——小米MIX Fold 3此前也屢屢被傳
  • 英特爾Xe HPG游戲顯卡:擁有512EU,單風(fēng)扇版本

    據(jù)10 月 30 日外媒 TheVerge 消息報道,英特爾 Xe HPG Arc Alchemist 的正面實被曝光,不僅擁有 512 EU 版顯卡,還擁有 128EU 的單風(fēng)扇版本。另外,這款顯卡 PCB
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美天堂亚洲电影院在线观看| 一区二区三区日韩精品| 国产综合视频在线观看| 欧美日韩国产影院| 国产精品卡一卡二| 国产综合久久| 亚洲靠逼com| 亚洲视频免费在线观看| 欧美专区18| 免费一级欧美片在线观看| 欧美日韩一区二区三区四区五区 | 欧美激情aⅴ一区二区三区| 欧美日韩日日骚| 国产亚洲精久久久久久| 亚洲人成在线影院| 午夜亚洲激情| 欧美国产日韩a欧美在线观看| 国产精品久久久999| 激情av一区二区| 中文日韩电影网站| 久久蜜桃精品| 欧美日韩综合在线免费观看| 国内精品久久久久久影视8| 99精品久久| 久久久久免费视频| 欧美色综合网| 在线观看日韩国产| 亚洲综合精品四区| 欧美激情精品久久久久| 国产亚洲精品久久久久婷婷瑜伽| 亚洲伦伦在线| 久久偷看各类wc女厕嘘嘘偷窃| 欧美调教视频| 亚洲国产成人av在线| 亚洲资源在线观看| 欧美国产日韩一区二区在线观看| 国产女主播一区| 一本色道久久88亚洲综合88| 久久精品视频在线观看| 国产精品区一区二区三区| 亚洲三级色网| 久久精品1区| 国产精品久久久久久福利一牛影视| 亚洲国产二区| 久久精品国产综合精品| 欧美午夜片欧美片在线观看| 亚洲国产一区二区三区在线播| 欧美亚洲一级| 国产精品久久久久久久第一福利| 亚洲精品九九| 免费欧美高清视频| 狠狠色丁香婷婷综合影院| 午夜天堂精品久久久久| 欧美性猛片xxxx免费看久爱| 亚洲精品国产精品乱码不99按摩 | 久久久国产一区二区三区| 国产精品男人爽免费视频1| 99国产精品99久久久久久粉嫩| 美女精品网站| 影视先锋久久| 久久久国产精品亚洲一区| 国产欧美日韩免费看aⅴ视频| 亚洲视频欧美视频| 欧美日韩喷水| 99精品视频免费| 欧美激情一区二区三区不卡| 亚洲福利免费| 另类图片国产| 亚洲福利视频在线| 麻豆久久婷婷| 在线看成人片| 美女福利精品视频| 在线免费观看日本欧美| 久久综合给合| 在线观看91精品国产入口| 久久久999精品视频| 国产亚洲人成a一在线v站| 羞羞色国产精品| 国产欧美亚洲一区| 午夜欧美精品久久久久久久| 国产人成精品一区二区三| 亚洲欧美日本国产专区一区| 国产精品毛片a∨一区二区三区|国| 亚洲午夜av在线| 国产精品国产三级国产普通话三级 | 在线观看一区视频| 久久综合综合久久综合| 在线免费观看日本欧美| 欧美多人爱爱视频网站| 亚洲人成久久| 欧美久久久久久久久| 日韩一区二区免费看| 欧美日韩中文字幕在线| 亚洲私人影院在线观看| 国产精品麻豆va在线播放| 亚洲免费在线视频一区 二区| 国产精品永久| 久久精品2019中文字幕| 曰本成人黄色| 欧美激情在线观看| 正在播放欧美一区| 国产精品亚洲产品| 久久精品国产亚洲一区二区| 亚洲第一精品电影| 欧美日韩国产麻豆| 亚洲欧美一区二区三区久久| 红桃视频欧美| 欧美精品精品一区| 亚洲影院色在线观看免费| 国产日韩精品久久| 噜噜噜久久亚洲精品国产品小说| 91久久精品国产| 欧美日韩在线播放三区四区| 午夜精品视频一区| 在线不卡亚洲| 欧美日韩免费观看中文| 午夜欧美不卡精品aaaaa| 黄色成人91| 欧美日韩国产片| 性欧美8khd高清极品| 1769国产精品| 亚洲国产乱码最新视频| 欧美日韩另类在线| 欧美诱惑福利视频| 亚洲国产三级在线| 国产精品www994| 久久久综合网站| 夜夜夜久久久| 国产亚洲欧美中文| 欧美激情在线狂野欧美精品| 亚洲欧美日韩成人| 在线看片欧美| 国产精品嫩草影院一区二区| 久久综合给合久久狠狠色| 一区二区欧美在线观看| 黑人中文字幕一区二区三区 | 欧美日本三级| 久久精品夜色噜噜亚洲aⅴ| 日韩天堂av| 国产在线播放一区二区三区| 欧美区视频在线观看| 欧美中文在线观看| 日韩一级精品视频在线观看| 国产一区二区中文字幕免费看| 欧美国产一区视频在线观看| 西西人体一区二区| 日韩一级黄色av| 在线视频国内自拍亚洲视频| 国产精品任我爽爆在线播放| 欧美激情亚洲国产| 久久精品动漫| 一区二区三区你懂的| 黄色资源网久久资源365| 欧美视频日韩视频| 免费看av成人| 久久av一区| 亚洲一区视频| 亚洲美女av网站| 伊人狠狠色j香婷婷综合| 国产精品入口麻豆原神| 欧美激情第10页| 久久久久久久综合日本| 亚洲一区二区精品| 亚洲清纯自拍| 一区二区三区在线视频免费观看 | 久久久久久免费| 亚洲欧美国产日韩中文字幕| 亚洲精品在线免费观看视频| 精品999在线观看| 国产日韩欧美综合精品| 欧美色网在线| 欧美激情视频一区二区三区在线播放| 久久不射中文字幕| 亚洲人精品午夜| 在线观看国产欧美| 国产自产v一区二区三区c| 国产精品人人做人人爽| 欧美日韩综合不卡| 欧美日韩国产成人在线91| 免费一级欧美片在线观看| 久久永久免费| 久久亚洲色图| 久久九九国产精品怡红院| 欧美一区二区三区在线| 亚洲男人的天堂在线| 宅男噜噜噜66一区二区| 一本色道久久综合亚洲精品婷婷| 亚洲日本欧美| 亚洲人成久久| 亚洲欧洲精品一区二区三区不卡| 尤物网精品视频| 伊人成年综合电影网| 影院欧美亚洲| 在线不卡亚洲| 在线不卡亚洲| 亚洲高清自拍| 亚洲韩国精品一区| 亚洲国产成人久久综合一区| 亚洲第一在线综合在线| 亚洲电影欧美电影有声小说| 亚洲国产成人精品久久| 亚洲人体影院| 日韩视频一区二区三区| 日韩午夜电影|