繁体   English   中英

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

[英]How to force a Java REST application into Idle State?

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

我希望能够像通过mySQL杀死进程一样杀死进程

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

我试图用Thread.currentThread()。interrupt()来实现,但这实际上并没有做任何事情。 我在整个应用程序中多次使用CompletionService和多线程来加速进程。

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

如何查找和停止所有当前正在运行的线程?

能做到吗?

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

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

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

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

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

如何停止后台任务

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

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

重要笔记

在执行此操作之前,请务必先阅读如何正确同步Java中线程之间的通信。 这是一个很好的资源https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM