java - 应用程序退出时优雅地关闭 javaagent
问题描述
我正在编写一个 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。我也看过 byte buddy 来改造主类,但是你能通过它添加一个关闭钩子吗?还有其他方法吗?
解决方案
这是因为 javaagent 中使用的线程不是守护线程。将这些更改为 setDaemon(true);
推荐阅读
- react-native - 我应该如何添加质量选择器来反应原生视频?
- visual-studio-code - 如何在特定标记之后突出显示一个单词?
- json - 在 Groovy 中将 JSON 解析为 CSV
- javascript - ReactJS 无法在 rest api 响应中打印嵌套值
- php - 视图不会根据导航栏改变
- java - 无法使用 Ansible 在远程主机中使用基于 java 的命令
- reactjs - Materiall UI Outlined TextField 在移动设备的边框中显示轮廓文本
- python - 是否可以制作“获取根本不重复的值”算法,而不使用排序?(时间复杂度 => O(n)
- google-cloud-platform - 无法通过 Google 云功能中的 VPC 连接器从私有 IP 地址访问 http 服务
- .net - 我想对这个登录方法进行单元测试