09 maja 2012

Uruchomienie wątku w servlecie w Servlet 3.0

Wczorajszy wpis "Asynchroniczne przetwarzanie w Servlet 3.0" przyciągnął uwagę Tomka oraz Grześka (a wiem również, że i Marcina) i utwierdził mnie w przekonaniu, że jeśli tylko temat poruszy się we właściwy sposób, może przyciągnąć uwagę skutecznie. Chciałbym móc poświęcić więcej czasu na Scalę i na niej budować takie zagadki, ale nie tym razem. Może ktoś zainspirowany spróbuje pociągnąć temat na swoim blogu, albo chciałby skorzystać z mojego?

Kontynuując poznawanie Servlet 3.0, mam kolejną zagadkę.

Poniższy servlet działa poprawnie, ale jedynie w obecnej "gołej" konfiguracji - nie korzystam chociażby z żadnych mechanizmów bezpieczeństwa. Gdzie jest potencjalny problem? Proszę wskazać linię jego możliwego wystąpienia. Dla pewnego uproszczenia zagadki podaję namiary na javax.servlet.AsyncContext.

package pl.japila;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = "/AsyncServlet", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

        // Put the request into asynchronous mode
        request.startAsync();

        // Run an asynchronous task
        MyTask mt = new MyTask(request, response);
        mt.run();
    }

    public class MyTask implements Runnable {

        HttpServletRequest request;
        HttpServletResponse response;

        public MyTask(HttpServletRequest request, HttpServletResponse response) {
            super();
            this.request = request;
            this.response = response;
        }

        @Override
        public void run() {
            AsyncContext asyncCtx = request.getAsyncContext();
            try {
                // do the job
                PrintWriter out = response.getWriter();
                out.printf("<h2>Hello from %s</h2>", this);
                out.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                asyncCtx.complete();
            }
        }
    }
}