gpt4 book ai didi

java - 在具有单个 HTTP 请求的 servlet 线程上运行长时间运行的进程总是不好吗?

转载 作者:行者123 更新时间:2023-11-30 07:01:13 26 4
gpt4 key购买 nike

我有一个 Java 应用程序(在 WAS 8.5 上运行),它充当客户端的一种服务器 list 。该应用程序有一个 servlet,可以触发长时间运行的进程。

流程:从第三方数据库获取数据,执行Java逻辑,将记录写回应用程序自己的数据库(这些数据库连接是池化的)。

servlet 不是启动时加载的,并且每月仅由单个操作人员手动触发一次(根据客户每月的选择在某个特定日期触发)。 Servlet 历史上一直以这种方式使用 Timer 和 TimerTask:

public class SyncMissingServlet extends HttpServlet implements Servlet{

public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
try{
SyncMissing.runSync();
}catch(Exception ex){
logger.error(new LogMessage("ERROR: "), ex);
this.sendReply(printWriter, "ERROR: " + ex.toString());
}
}
}

public class SyncMissing
{
public static void runSync() throws Exception
{
Timer t = new Timer(true);

SyncMissingTask task = new SyncMissingTask(); //SyncMissingTask is an instance of TimerTask
// Start the synchronization 5 secs from now, and run it every 30 days.
t.schedule(task, 5000, 2592000000l); //this 30 day timings never really worked out for the client,
//since the app server is restarted frequently for deployments.

}
}

当前代码中没有使用 Timer.close() 或 TimerTask.close()。最近,在系统重新启动并重新启动系统上的 WAS 服务后,这个 Servlet 似乎自动触发了......这就是令人担忧的地方。

虽然我无法向客户解释自动触发,但我提出了以下选项:
1. 停止使用 Timer 和 TimerTask(长时间运行的进程然后在 servlet 的线程本身上运行)
2.代替TimerTask,将其设为常规Runnable,并在servlet线程内的单独线程中运行它。
3.利用Java的Executor Service
4.迁移到Servlet 3.0并将servlet变成Async servlet。
5. 完全放弃servlet,并用批处理作业替换它。

我知道选项 3 和 4 确实是推荐的选项(或者可能是选项 5)。但我有一种感觉,在我的业务场景中 - 选项 3 和 4 可能有点矫枉过正。

如果确实需要每月仅由一名用户手动调用 servlet,那么选项 1 和 2 就那么糟糕吗?(我的客户想要最快的解决方案,并且肯定不会资助选项 5)

最佳答案

好吧,如果 servlet 应该每月只运行一次,并且只有一个客户端触发它,那么可以在 servlet 的线程本身中运行它,或者在 servlet 内创建一个新线程并让它执行任务。当您有很多客户端同时发出请求时,就会出现负载和响应时间的问题,此时您可能需要使用 Executor 服务或异步 Servlet。

关于java - 在具有单个 HTTP 请求的 servlet 线程上运行长时间运行的进程总是不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40892136/

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