5 Stimmen

Hintergrundprozess im Servlet

Ist es möglich, einen Hintergrundprozess in einem Servlet! zu implementieren?

Lassen Sie mich das erklären. Ich habe ein Servlet, das einige Daten anzeigt und einige Berichte generiert. Die Generierung des Berichts impliziert, dass die Daten bereits vorhanden sind, und es ist dies: jemand anderes diese Daten hochladen.

Zusätzlich zur Berichtserstellung sollte ich eine Möglichkeit implementieren, bei Eingang neuer (hochgeladener) Daten eine E-Mail zu versenden.

19voto

BalusC Punkte 1034465

Die funktionale Anforderung ist unklar, aber um die Frage aktuell Frage: Ja, es ist möglich, einen Hintergrundprozess im Servletcontainer laufen zu lassen.

Wenn Sie einen anwendungsweiten Hintergrund-Thread wünschen, verwenden Sie ServletContextListener beim Starten und Herunterfahren der Webapp einhaken und die ExecutorService um es auszuführen.

@WebListener
public class Config implements ServletContextListener {

    private ExecutorService executor;

    public void contextInitialized(ServletContextEvent event) {
        executor = Executors.newSingleThreadExecutor();
        executor.submit(new Task()); // Task should implement Runnable.
    }

    public void contextDestroyed(ServletContextEvent event) {
        executor.shutdown();
    }

}

Wenn Sie noch nicht mit Servlet 3.0 arbeiten und daher nicht die @WebListener registrieren Sie es wie folgt in web.xml stattdessen:

<listener>
    <listener-class>com.example.Config</listener-class>
</listener>

Wenn Sie einen sitzungsweiten Hintergrund-Thread wünschen, verwenden Sie HttpSessionBindingListener um sie zu starten und zu stoppen.

public class Task extends Thread implements HttpSessionBindingListener {

    public void run() {
        while (true) {
            someHeavyStuff();
            if (isInterrupted()) return;
        }
    }

    public void valueBound(HttpSessionBindingEvent event) {
        start(); // Will instantly be started when doing session.setAttribute("task", new Task());
    }

    public void valueUnbound(HttpSessionBindingEvent event) {
        interrupt(); // Will signal interrupt when session expires.
    }

}

Bei der ersten Erstellung und dem ersten Start, machen Sie einfach

request.getSession().setAttribute("task", new Task());

0voto

Julian Dehne Punkte 83

Ich danke Ihnen! Ich habe mich gefragt, ob dies besser innerhalb eines Anfragebereichs wie getan werden sollte:

public class StartServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {                   
        request.getSession().setAttribute("task", new Task());     
    }
}

Auf diese Weise wird der Prozess gestoppt, wenn der Benutzer die Seite verlässt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X