tomcat - 在servlet中启动线程并发送响应

时间:2011-03-21 18:27:19

标签: java android multithreading servlets httpclient

如何启动将在后台运行的线程,但响应会立即发送给用户?

我正在尝试从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上阻塞,而是在一个线程中处理它,并将响应发送给客户端。

感谢

1 个答案:

答案 0 :(得分:2)

这在标准HTTP中是不可能的。只有在请求正文被完全消耗后才能发送响应。只要您不拨打uploadHandler.parseRequest(request);,就不会上传文件。如果你告诉“你已经完成了”,你会撒谎!在此之前。

在调用uploadHandler.parseRequest(request)之后只有并拥有这些项目,您可以诚实地告诉用户他已经完成了。然而,残余物可以完全在单独的线程中完成。我建议为ServletContextListener管理一个固定的线程池。但是,我认为当你没有对上传的文件做任何昂贵的任务时,这有点夸张。

对于具体的问题(应用程序似乎在忙于上传文件时什么都不做),我宁愿建议在客户端解决问题。获取文件的大小,获取发送到输出流的字节数,然后在客户端显示一些进度条,以便客户端了解进度。