【问题标题】:Gracefully shut down javaagent when application exits应用程序退出时优雅地关闭 javaagent
【发布时间】:2019-01-31 05:29:03
【问题描述】:

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

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

这是我的主要方法。我正在使用 Prometheus 的 Java 库来生成指标,并为服务器本身使用码头。

    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 来改造主类,但是你能通过它添加一个关闭钩子吗?还有其他方法吗?

【问题讨论】:

    标签: java javaagents


    【解决方案1】:

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

    【讨论】:

    • 我想清理资源,比如在关机前保存日志。有什么办法吗?
    • 要进行清理,您可以使用shutdownhook docs.oracle.com/javase/7/docs/api/java/lang/…shutdown hooks, but they require access to the main method - 这是错误的,你可以在jvm关闭过程开始之前以任何方法注册shutdownhook。
    猜你喜欢
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多