gpt4 book ai didi

java - 如何强制 Java REST 应用程序进入空闲状态?

转载 作者:行者123 更新时间:2023-12-02 02:07:05 29 4
gpt4 key购买 nike

我有一个包含大约 30 个端点的 REST 应用程序。除此之外,用户还可以提交需要 20-60 分钟处理的后台任务。有时很明显,提交的请求永远不会从日志中完成,但是,我唯一能做的就是重新部署相同版本的代码。

我希望能够像通过 mySQL 那样终止进程

'Show Process List' -> 'Kill <ProcessId>'.

我尝试用 Thread.currentThread().interrupt() 来实现,但这并没有真正做任何事情。我在整个应用程序中多次使用 CompletionService 和多线程来加快流程。

我的目标是我应该能够调用此 API 将应用程序返回到没有进程运行时的状态。我检查了这篇文章,但似乎每个人都对此提出警告。

How to find and stop all currently running threads?

这可以做到吗?

最佳答案

为什么 Thread.currentThread().interrupt() 不起作用

Thread.currentThread() 返回您正在运行的当前线程的 Thread 对象,因此,如果您在后台任务线程之外调用此对象,它将不会返回对后台的引用线。如果您想要对后台线程的引用,您必须自己跟踪它。

thread.interrupt() 在线程上设置中断标志。但是,如果您的线程从未显式检查中断标志,则它不会执行任何操作。您必须定期检查后台任务中的中断标志,然后采取适当的操作。

if (Thread.currentThread().isInterrupted()) {
finishWork(); // Close any resources used.
return;
}

对于您的用例,我实际上不鼓励在后台任务中使用interrupt(),特别是如果您使用线程池。具体来说,如果您使用线程池,则可以重用同一线程来运行多个后台任务。由于线程被重用,因此可能会意外中断您从未打算中断的后台任务。

如何停止后台任务

这需要做大量的工作,但这是可行的。下面我描述了一个非常基本的实现,足以满足您的用例。

  1. 首先,您必须创建类似 SpringBoot 服务的内容。这是一个单例类,它被注入(inject)到执行其余端点的所有类中。该服务将是一个后台任务跟踪器,它保留从任务 ID 到指示任务是否应终止的标志的映射。
  2. 接下来,您必须创建一个休息端点来终止后台任务。其余端点应将要终止的任务 ID 作为查询参数或路径参数。
  3. 当端点执行时,您可以在后台任务跟踪器上调用终止方法,该方法将翻转指示任务应终止的标志。 注意:您的后台任务可能在您实际终止之前就已完成,因此您的代码应该处理这种极端情况。
  4. 启动后台任务时,您应该为其提供对后台任务跟踪器的引用。
  5. 您的后台任务应该做的第一件事就是创建一个唯一的任务 ID。您可以从使用 UUID.randomUUID() 开始。
  6. 创建任务 ID 后,将其提供给您的后台任务跟踪器。
  7. 在日志中打印后台任务的任务 ID。
  8. 后台任务可以继续执行其工作,但应定期检查后台任务跟踪器是否已取消。如果不是继续处理,如果是则关闭所有使用的资源并返回。
  9. 在后台任务退出之前,您应该将其从后台任务跟踪器中删除,以避免内存泄漏。

重要说明

在实现此之前,请务必阅读如何正确同步 java 中线程之间的通信。这是个好资源https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

关于java - 如何强制 Java REST 应用程序进入空闲状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50616352/

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