在应用程序退出时优雅地关闭 javaagent

Gracefully shut down javaagent when application exits

我正在编写一个 javaagent 来监视应用程序。它启动服务器并显示计算的指标。

如何配置我的代理程序以便在应用程序关闭时执行一些清理并退出代理程序?我查看了关闭挂钩,但它们需要访问我没有的主要方法。

这是我的 premain 方法。我正在使用 Prometheus 的 Java 库来生成指标,并使用 jetty 作为服务器本身。

    Server server = new Server(1234);
    ServletContextHandler context = new ServletContextHandler();
    context.setContextPath("/");
    server.setHandler(context);
    // Expose Promtheus metrics.
    context.addServlet(new ServletHolder(new MetricsServlet()), "/");
    // Add metrics about CPU, JVM memory etc.
    DefaultExports.initialize();


    // Start the webserver.
    server.start();
    server.join();

当应用程序退出时,JVM 不会退出,因为我的代理正在阻止它。我正在从服务器生成日志,并希望保存我拥有的任何数据并退出,而不是阻止 JVM。我也看过byte buddy改造mainclass,但是能不能通过它加一个shutdown hook?还有其他方法吗?

这是因为 javaagent 中使用的线程不是守护线程。将这些更改为 setDaemon(true);