【问题标题】:Java there is a way to guarantee a shutdown hook finish?Java有没有办法保证一个shutdown hook完成?
【发布时间】:2022-08-23 13:31:38
【问题描述】:

我需要在关机时执行一些中等负载,但在 AWS 中,机器只给线程执行 2 秒或更短的时间,并且只消耗了 45-47% 的负载。

有没有办法增加这个?还是我无能为力!

话题开始了。

07:22:09.476 [Thread-61] INFO  com.company.main.Main.lambda$run$0(307) - Shutdown process start with thread: [Thread-61]

最后一行。

07:22:11.026 [Thread-61] DEBUG c.p.w.company.lambda$sort$1(341)

如您所见,线程完成需要 1.5 秒,我需要完成该方法:(

我们正在使用 EC2!

对不起,如果问题很简单,但这让我做噩梦。

代码不是我的,但是是这样的。

public class Main extends Thread {

在公共静态方法中,我们创建了一些线程。

for (int i = 0; i < threads; i++) {
      Main main = (Main) ctx.getBean(\"beanName\");
      main.setName(\"main-\" + i);
      main.start();
 }

主班方法覆盖

@Override
public void run() {
    if (StringUtils.equals(\"main-0\", Thread.currentThread().getName())) {
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            doWork();
        }));
    }

如您所见,我们正在创建的 1 个主线程上创建关闭,我确实在主要的线程也是如此,但同样的事情也会发生。

  • 你在哪里运行它?拉姆达? EC2?你怎么关闭它?
  • 嗨@Michael EC2!亚马逊正在关闭机器!
  • 这将取决于运行时的结束方式。某些进程信号(例如SIGKILL)和进程内调用(例如Runtime#halt)不会可靠地调用关闭挂钩。您可能需要查看 AWS 的文档以了解如何处理这种情况。
  • 根据我发现的其他一些线程,它应该等待几分钟或更长时间,所以我怀疑这是 JVM 而不是与 AWS 有任何关系。也许您的关闭任务是异步的,因此会解除对关闭线程的阻塞?
  • 包括关闭挂钩的代码。

标签: java amazon-web-services amazon-ec2 shutdown-hook


【解决方案1】:

通常项目在这种情况下使用“事务”。您无法真正避免机器被关闭,有时您甚至不会收到通知。可靠处理此问题的唯一解决方案是使用 ATOMIC 操作,即“事务”

无法保证关闭挂钩始终完成甚至被触发,否则您可能会在关闭挂钩中无限期地挂起关闭过程。关闭挂钩是让您有机会优雅地关闭 - 例如。通知系统的其他组件,这样他们就不会浪费时间尝试连接,或者尝试保存一些可能有用的东西。但这可以用于一种关闭优化,使其尽可能优雅,但不能依赖它来保证数据或操作的完整性。就是这样,如果您考虑一下,这完全有道理。

【讨论】:

  • 调用关闭后我需要执行代码,但与数据库无关。
  • 但是关机后你到底需要做什么呢?
  • 并非所有操作都可以原子化,这并不真正适用于需要在关机时执行的多个操作。
  • 仅仅因为你不能总是干净地处理关机(即崩溃)并不意味着你不应该尝试.
  • 存储一些统计信息发送一个 lambda 将使用的 JSON,但我需要处理一些介于 250-300 之间的报告。每个大约需要 0.1 秒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多