如何启动将在后台运行的线程,但响应会立即发送给用户?
我正在尝试从Android设备上传文件。虽然上传过程运行正常,但我想告诉用户,一旦文件从他的末端上传,该过程就已经完成。
我已经检查过调用ServletFileUpload.parseRequest()需要很长时间。
ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
List items = uploadHandler.parseRequest(request);
所以基本上我正在寻找一种方法,我可以告诉用户“嘿,你已经完成了你的部分”,现在轮到servlet进行所有处理了。
但我不能因为parseRequest阻止。
我错了,因为它阻止因为它实际上是由设备发送的吗?
在Android上传:
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上阻塞,而是在一个线程中处理它,并将响应发送给客户端。
感谢
答案 0 :(得分:2)
这在标准HTTP中是不可能的。只有在请求正文被完全消耗后才能发送响应。只要您不拨打uploadHandler.parseRequest(request);
,就不会上传文件。如果你告诉“你已经完成了”,你会撒谎!在此之前。
在调用uploadHandler.parseRequest(request)
之后只有并拥有这些项目,您可以诚实地告诉用户他已经完成了。然而,残余物可以完全在单独的线程中完成。我建议为ServletContextListener
管理一个固定的线程池。但是,我认为当你没有对上传的文件做任何昂贵的任务时,这有点夸张。
对于具体的问题(应用程序似乎在忙于上传文件时什么都不做),我宁愿建议在客户端解决问题。获取文件的大小,获取发送到输出流的字节数,然后在客户端显示一些进度条,以便客户端了解进度。