0

我正在尝试实现一个多线程 java servlet,我需要在其中发送每个传入请求的响应,下面是我的代码

public class RequestController extends HttpServlet {

    private ExecutorService pool;

    @Override
    public void init() {
        final int NTHREADS = 100;
        pool = Executors.newFixedThreadPool(NTHREADS);
    }

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try {
            BufferedReader br = request.getReader();
            String msg = br.readLine(), temp;

            while ((temp = br.readLine()) != null) {
                msg +=  temp;
            }
            br.close();

            if (msg == null) {
                msg = request.getParameter("request");
                if (msg == null) {
                    System.out.println("Invalid request");
                    return;
                }
            }

            System.out.print("Request received: ");
            System.out.println(msg);
            pool.submit(new HandleRequest());

        } catch (Exception e) {
            e.printStackTrace(System.out);
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }
}

现在的问题是发送每个请求的响应。我试图通过传递 HttpServletResponse 响应对象来解决这个问题

pool.submit(new HandleRequest(response));

但这仅向最后一个请求发送响应。如何正确执行?请帮忙。

4

2 回答 2

2

不要为线程池而烦恼,也不要向它分派请求。您正在使用的应用程序服务器已经为您执行此操作 - 每个请求通常在一个单独的线程中处理,在一个由应用程序服务器管理的线程池中。

所以不要使用HandleRequest,只在方法中处理请求processRequest,它会在自己的线程中,不会阻塞其他请求。

于 2013-06-05T10:00:22.583 回答
1

您尝试归档的内容将不起作用。

您可以使用 Servlet 3.0 规范的 Async API。

查看异步 Servlets 教程 如何使用它。

于 2013-06-05T10:06:31.430 回答