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

标签 java android multithreading servlets httpclient

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

我正在尝试从 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/

相关文章:

java - 我的矩阵旋转有什么问题?

android - 向特定号码的电话发送短信

java - JVisualVM 线程调查器中的 Keep-Alive-Timer 是什么意思?

java - 在 main 中创建类对象时找不到符号错误

java - 嵌入式 neo4j webadmin 不工作

android - Retrofit-2 内容类型问题

android - 检索 Android 中其他应用播放的音乐/歌曲信息

java - java创建线程时出错

c - pthreads 程序表现不佳

java - 如何处理 XML-RPC 中的错误响应?