java - com.sun.management.OperatingSystemMXBean 在 OSGi 包中的使用

标签 java monitoring osgi equinox apache-felix

我有一些遗留代码用于监控我的应用程序 cpu、内存等,我想将它们转换为一个包。现在当我开始这个包时它提示

Missing Constraint: Import-Package: com.sun.management; version="0.0.0"

我曾使用 OperatingSystemMXBean 来访问 JVM 上的统计信息。

我的问题是我可以在 OSGI 容器中使用这个类吗?如果可以的话怎么办?或者我应该使用其他方式来监控我的应用程序。我正在从 Web 前端对应用程序进行 RMI 调用,以获取 OSGi 之前的节点性能数据。

最佳答案

以下是我必须做的才能使它正常工作。

我必须将 com.sun.management 添加到系统包的 systemProperties 值中,因为我是 OSGI 的新手,这花了我一段时间才弄明白。我使用 maven-pax-plugin,所以我需要添加以下属性。默认情况下它不起作用的原因是 equinox 我选择的 osgi 容器默认不包括系统包中的 com.sun.* 包。

通过使用 bundle 0 命令查看系统包,这一点很明显,因为 bundle 0 始终是系统包,这对我来说是新事物。

<param>--sp=com.sun.management</param>

添加此命令后,系统 bundle 包括 com.sun.management 和我的 bundle 部署没有任何问题。

默认情况下,equinox 不在 systemProperties 中包含 com.sun 包的原因参见 here . (直接调用 sun.* 包的 Java 程序不能保证在所有 Java 兼容平台上工作。事实上,即使在同一平台上的 future 版本中,这样的程序也不能保证工作。)

因此,您有两种选择可以将 com.sun 添加到 osgi 容器中。

解决方案 A':扩展包

这些作为片段;它们不是自己的束,而是附加到主机上。扩展包是一种特殊的片段,它只附加到系统包,以提供框架的可选部分。可以使用这种机制来创建一个空的扩展,它只声明所需的包,将加载留给它的托管包(在本例中是框架)。我没有选择这条路线,因为第二个选项实现起来更快。

解决方案 B:引导委托(delegate)

我最后选择的选项是引导委托(delegate)。这允许用户创建将始终由框架父类加载器加载的“隐含”包,即使包没有提供正确的导入。我通过将系统包设置为包含 com.sun.management 来实现。

看下面的优link更详细地描述了整个问题。

关于java - com.sun.management.OperatingSystemMXBean 在 OSGi 包中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2630069/

相关文章:

java - osgi 包如何知道接口(interface)?

java - 如何查看已安装的 Karaf 功能的内部情况

java - 反射值输出不正确

linux - 如何使用 nagios 或 munin 从外部应用程序/服务器中查询统计信息

java - JTree 更新节点而不折叠

java - Java EE/Seam 应用程序中的 session 大小

MySQL开源性能监控工具

java - OSGi bundle - 获取 DataSourcePool 以在 Adob​​e CQ5 中的 servlet 中使用

java - 如何使用 Gradle 在 IntelliJ 中设置 SLF4J

java - 将不同数据集概括为坐标系以显示为图形的算法