1.线程问题
数据导出时,由于调用了存储过程,所以在后台处理很多的东西,如果这时再次开启另外一个任务,会造成服务器卡死的现象。所以为了避免出现这种情况,使用了线程来调用存储过程以及对数据的导出。
大概思路是:使用将map<String, Thread>放入到servletContext中,将线程放入到map中,在界面获取这个map中的内容。如果map为null,那么说明当前服务器中没有线程
在运行,说明此时服务器空闲。可以开启新的任务。在线程开启后,将线程对象放入map中,此时就可以实时掌握线程的运行情况。当线程运行完成后,在finally块中需要将map
置空,保证下一次使用前map为null。
2.界面刷新
在线程运行的过程中,界面需要进行刷新操作,来保证线程运行完成以后界面中任务的显示状态和内容会改变。此时,需要计时器函数的帮忙。
大概思路:界面使用了jQuery技术,使用applicationScope.XXX(attribute的内容)['key'] 可以获取到servletContext中的内容。在$(function(){...});中定义每次刷新都会执行的
内容,就是计时器。 当获取的内容不为空时,有线程在运行,time = window.setInterval(fresh, 5000); 定义每个5S刷新一次,当内容为null时,使用window.clearInterval(time)
关闭计时器,界面显示完成后的最终效果。
3.额外需要注意
(1) 界面JS对时间的处理,需要判断月份是否小于10来确定是否要给月份前边加0.
(2) IO流读取文件路径:this.getSesion().getServletContext().getRealPath("/") + "/WEB-INF/...";
(3) 当写入完成后需要进行flush()保证正常写入,最后要关掉IO流。