尝试使用队列优化导出execl表任务

前言 这周尝试做一个使用队列优化导出execl表的issue,因为服务器内存原因,多个导出任务同时进行可能会导致内存溢出,使用队列进行依次导出,减少服务器压力。
尝试使用队列优化导出execl表任务
文章图片

任务中还指出在队列等待时可以中途取消导出操作,此时应该是队列中删除相应实体.
队列 队列是一种先进先出的数据结构,区别于栈的先进后出,在java中队列只作为接口出现,一般使用链表实现其接口.
然后我们需要定义一个实体ExportExcel来记录一次导出用到的一些参数。
然后还需要定义的一些导出参数是随机文件名filename,用于反应后台进度,响应HttpServletResponse.
定义一个服务类

/** * 对列入队 * @param exportExcel */ void pull(ExportExcel exportExcel); /** * 执行循环导出方法 * @throws IOException */ void export() throws IOException; /** * 队列是否为空 * @return */ Boolean queueIsEmpty();

【尝试使用队列优化导出execl表任务】重构c层代码
// 新建一个对象 ExportExcel exportExcel = new ExportExcel(); // 传入参数 ......// 如果当前队列为空,入队并执行,如果队列不空,只入队 if (this.exportQueueService.queueIsEmpty()) { this.exportQueueService.pull(exportExcel); this.exportQueueService.export(); } else { this.exportQueueService.pull(exportExcel); }

优先队列 然后去网上查找发现 java有一个PriorityQueue实现队列接口,称为优先队列。有限队列与队列的区别在于,,它的出队顺序与元素的优先级有关,对优先队列调用出队方法,返回的总是优先级最高的元素。但是这并不意味这着队列已经按照优先级从高到低的顺序排好了队。
//创建优先队列 PriorityQueue numbers = new PriorityQueue<>(); //入队两个元素 numbers.offer(4); numbers.offer(2); System.out.println("PriorityQueue: " + numbers); //再入队一个元素 numbers.offer(1); System.out.println("更新后的PriorityQueue: " + numbers);

输出结果
PriorityQueue: [2, 4] 更新后的PriorityQueue: [1, 4, 2]

    推荐阅读