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());