Servlet中的后台进程

时间:2010-06-21 12:23:16

标签: servlets process background

是否可以在servlet中实现后台进程!?

让我解释一下。 我有一个servlet,显示一些数据并生成一些报告。 报告的生成意味着数据已经存在,就是这样:其他人上传这些数据。

除了报告生成之外,我还应该实施一种在新数据到达时发送电子邮件的方法(上传)。

2 个答案:

答案 0 :(得分:17)

功能要求不清楚,但要回答实际的问题:是的,可以在servletcontainer中运行后台进程。

如果您需要应用程序范围的后台线程,请使用ServletContextListener挂钩webapp的启动和关闭,并使用ExecutorService来运行它。

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

}

如果您尚未使用Servlet 3.0,因此无法使用@WebListener,请在web.xml中将其注册如下:

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

如果您想要一个会话范围的后台线程,请使用HttpSessionBindingListener来启动和停止它。

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.
    }

}

首次创建并开始时,只需执行

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

答案 1 :(得分:0)

谢谢!我想知道在这样的请求范围内是否应该做得更好:

public class StartServlet extends HttpServlet {

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

这样,当用户离开页面时,该过程就会停止。