前言这周尝试做一个使用队列优化导出execl表的issue。由于服务器内存的原因,同时导出多个任务可能会导致内存溢出。使用队列顺序导出,减少Server压力。该任务还指出,导出操作可以在队列等待的过程中中途取消。这时,队列中相应的实体应该被删除。Queue队列是一种先进先出的数据结构,不同于栈的先进先出数据结构。在java中,队列只是作为接口出现的时候,一般使用链表来实现它的接口。为了防止导出过程中服务器宕机,同时也为了方便用户下载历史导出记录,增加了historyExportExcel实体,用于保存每次查询的查询参数,如文件名等属性。原来的导出逻辑需要修改后分为两种情况。一种情况是请求导出excel表格的时候没有导出excel表格的任务,所以直接导出。一种情况是在请求导出excel表格时有任务正在导出,这时需要提醒用户当前有很多导出任务,已经添加到导出任务队列中。请稍后在历史出口列表中查看它们。那么需要考虑第二种情况,后台如何告诉前台加入出口队列,比如后台告诉前台当前出口队列的长度,比如1,2,3。那么和直接导出时1-100的导出进度有什么区别呢?第一个修改变成两个请求。第一个请求首先请求当前导出队列的长度。如果不为0,则不会发出请求,并提示用户进行第二次修改。老师告诉我,可以根据响应头的content-type字段来判断不同类型的值。如果token是通过输出流写入的,则不会有content-type,也可以将响应头定义为content-type。如果是return的值,那么content-type字段默认为application/json。然后根据content-type,将之前的2个请求简化为1个请求。如果当前导出队列为空,则直接导出,通过输出流返回文件名。如果当前队列不为空,则内容类型将指定为application/json。遇到问题,即使返回content-type类型的字段,也会有进度。返回filename时,前台会获取1-100的进度,前台会根据进度值调用加载弹窗。返回队列长度的时候,也会有进度,进度为1。加载弹窗也是在这个时候调用的。通过老师的指导,在前台看断点返回的数据类型。第一个数据={type:3,loaded:1,total:1}第二个数据=HttpResponse{headers:HttpHeaders,status:200,statusText:"OK",url:"http://localhost:8015/api/resident/exportExcel?page=0&size=10&loading-ignore=true",ok:true,…}如果是filename,total值为100,如果是queuelength,total是一个小于100的值。然后添加实体状态字段以防止并发问题
