如何启动一个在后台运行但响应会立即发送给用户的线程?
我正在尝试从 Android 设备上传文件。虽然上传过程正常,但我想告诉用户,一旦文件从他那端上传,该过程就完成了。
我已经检查过对 ServletFileUpload.parseRequest() 的调用需要很长时间。
ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
List items = uploadHandler.parseRequest(request);
所以基本上我正在寻找一种方法,让我可以告诉用户“嘿,你已经完成了你的部分”,现在轮到 servlet 进行所有处理了。
但我不能,因为 parseRequest 阻塞了。
我是否错了,因为它是在设备实际发送时才阻塞的?
在安卓上上传:
while (bytesRead > 0)
{
task.myPublishProgress(totalBytesRead, fileSize);
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
totalBytesRead+= bytesRead;
}
// send multipart form data necesssary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
// close streams
fileInputStream.close();
dos.flush();
Log.i(TAG ,"Database file with name " + this.fileName + " has been successfully written");
InputStream is = conn.getInputStream();
// retrieve the response from server
int ch;
StringBuilder b = new StringBuilder();
while( ( ch = is.read() ) != -1 ){
b.append( (char)ch );
}
dos.close();
在服务器上处理:
DiskFileItemFactory fileItemFactory = new DiskFileItemFactory ();
ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
/*
* Parse the request
*/
System.out.println("parsing the request....");
**List items = uploadHandler.parseRequest(request);**
FileItem item = (FileItem) items.get(0);
fileName = item.getName();
File file = new File(destinationDir, fileName);
item.write(file);
我希望 servlet 在 parseRequest 上不要太阻塞,而是可能在一个线程中处理它,并将响应发送给客户端。
谢谢
最佳答案
这在标准 HTTP 中是不可能的。仅当请求主体已完全使用时才能发送响应。只要您不调用 uploadHandler.parseRequest(request);
,文件就不会被上传。如果你说“你完成了!”,那你就是在撒谎。在此之前。
只有 调用 uploadHandler.parseRequest(request)
并获得项目后,您才能诚实地告诉用户他已经完成了。然而,剩余部分可以完美地在单独的线程中完成。我建议为由 ServletContextListener
管理的线程池创建一个固定的线程池。但是,我认为当您没有对上传的文件执行任何昂贵的任务时,这有点夸张。
至于具体问题(应用程序在忙于上传文件时似乎什么都不做),我宁愿建议在客户端解决问题。获取文件的大小,获取发送到输出流的字节数,然后在客户端显示一些进度条,以便客户端了解进度。
关于java - tomcat - 在 servlet 中启动线程并发送响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5381940/