多文件上传、excel多文件导入(大量数据)
置顶2018年03月02日 14:52:32
阅读数:436
问题:多个excel文件导入(上传)
思路:由于文件选择只能单个文件选择,那么可以将excel文件一个一个上传到本地或服务器,将路径保存至数据库中,后台使用队列进行操作,即上传第一个文件时便在后台开启一条线程,注意是只开启一条如果多条会导致死锁等各种问题,开启线程后,将陆续上传的文件加入队列中,只要队列中有数据就不结束线程,直到队列中的数据全部执行完也就是前端上传的文件全部导入到数据库中就结束线程。前端提供进度条。即能上传大量数据又不影响前端页面的操作,只需查看进度条即可知道数据上传量。
效果图片:
后台实现代码:
1、将上传的文件一个个加入队列中
首先将所有上传文件存到本地或者服务器,将路径存储到数据库
String filePath = fileService.upload(FileInfo.FileType.file, file, true, null); ImportLog importLog = importLogService.putDownTask(total, file.getOriginalFilename(), filePath); importSubject.addTask(importLog);
再讲一个个存到数据库中的文件路径放到队列中。addTask();方法如下
@Resource(name = "productImportSubscriber") private ImportSubscriber importSubscriber; @Resource(name = "taskExecutor") private ThreadPoolTaskExecutor threadPool;
@Resource(name = "importEvent") private ImportEvent importEvent;
public void addTask(ImportLog importLog) { importSubscriber.add(importLog); if (!importEvent.isRunning()) { threadPool.execute(new Runnable() { @Override public void run() { importSubscriber.start(); } }); } }
判断isRunning是否在启动,所有每次只有一个文件在导入,并不会出现其他资源争抢的情况。
_/** _ * _观察者接口 _ */ public interface ImportSubscriber {
Boolean start();
**void** add(ImportLog importLog);
}
实现ImportSubscriber接口:
public static Queue queue = new LinkedList<>();
@Override public Boolean start() { importData();//此处就可以处理不同系统的业务逻辑,比如导入数据 return true; }
@Override public void add(ImportLog importLog) { queue.add(importLog); }
到这里多文件导入就结束了,从全局看,这种方式只是比较巧妙了运用了队列。比如如果你要导入一个excel文件,有100W+的数据,那么前端
会非常慢,导致那个页面除了一直导入以外什么事也做不了,那么用户体验就非常差,而这里是先将文件存储起来,
在后台慢慢执行,而前端只是给了一个进度条,可以告知用户什么时候能导入完。
转载至链接:https://my.oschina.net/u/3566463/blog/1830473