在应用程序退出时正常关闭javaagent

时间:2019-01-31 05:29:04

标签: java javaagents

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

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

这是我的主要方法。我正在使用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。我也看过字节伙伴来转换主类,但是可以通过它添加关闭钩子吗?还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

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