0

各着信要求の応答を送信する必要があるマルチスレッド Java サーブレットを実装しようとしています。以下は私のコードです。

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 を使用できます。

Asynchronus Servlets Tutorialの 使用方法を参照してください。

于 2013-06-05T10:06:31.430 に答える