gpt4 book ai didi

servlets - Servlet 中的后台进程

转载 作者:行者123 更新时间:2023-12-01 07:08:31 28 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to run a background task in a servlet based web application?

(5 个回答)


6年前关闭。




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

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

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

最佳答案

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

如果你想要一个应用程序范围的后台线程,使用 ServletContextListener Hook 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>

如果你想要一个 session 范围的后台线程,使用 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());

关于servlets - Servlet 中的后台进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3084542/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com