前言
这周尝试做一个使用队列优化导出execl表的issue,因为服务器内存原因,多个导出任务同时进行可能会导致内存溢出,使用队列进行依次导出,减少服务器压力。
文章图片
任务中还指出在队列等待时可以中途取消导出操作,此时应该是队列中删除相应实体.
队列
队列是一种先进先出的数据结构,区别于栈的先进后出,在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]