我有一个zip文件下载功能。 此函数在服务器的输出文件夹中生成 .zip 文件并下载。 一切都很完美!
然而,使用多用户进行测试并不起作用。 如果3个用户同时尝试生成文件,则只返回一个响应文件以供下载。 其他2个用户正在等待,并且没有结果(没有错误发生,ajax调用永远不会返回)。
我的代码:
JavaScript的:
$.fileDownload('\GenereteZipAction', {
httpMethod: "POST",
data: $('#formZip').serialize()
}).done(function () {
alert('Download successfully.');
$('#modalZipLoading').modal('hide');
})
.fail(function () {
alert('Error');
$('#modalZipLoading').modal('hide');
});
爪哇:
//get the name of user
userName = request.getParameter("user");
//get real path
String realPath = getServletContext().getRealPath("/");
//create user folder
File fileOutput = new File(realPath+"/reports/output/"+userName);
fileOutput.mkdirs();
//generete reports in the user output folder
ReportHelper helper = new ReportHelper();
helper.genereteReports(fileOutput);
//set the reponse and...
response.setContentType("application/zip");
response.addHeader("Content-Disposition", "attachment;filename=Relatorios.zip");
//set the cookie for $.fileDownload go to done function
response.setHeader("Set-Cookie", "fileDownload=true; path=/");
//zip output user folder
ZipHelper zipHelper = new ZipHelper ();
zipHelper.zipAllfiles(fileOutput);
//create and fill ZipOutputStream
ZipOutputStream zip = new ZipOutputStream(response.getOutputStream());
zipHelper.fillZipOutputStream(zip);
//do download
zip.flush();
//close
zip.close();
//delete folder
deleteDir(fileOutput);
我的系统适用于超过五千名用户,所以我确信两个以上的用户会同时使用报告生成功能。 我没有太多关于aplication server的信息,只知道它是IBM WebSphere。
我不知道问题是在我的代码中,还是在服务器上 不允许多用户。欢迎各方面的帮助!!!
答案 0 :(得分:2)
您很可能遇到线程安全问题。这可能会对您有所帮助:https://www.quora.com/What-does-the-term-thread-safe-mean-in-Java
ReportHelper
或ZipHelper
可能不是线程安全的。 genereteReports
看起来正在修改文件系统上的内容。我会仔细查看代码并在每一行上问自己,“当我的第一个线程执行此行时,如果其他东西试图执行会发生什么?”我建议调查synchronized
次来电及其工作原理。