0

我必须通过 mbean 访问某些应用程序,以便我可以更改其应用程序属性。现在我认为这可以通过两种方式完成:

  1. 首先,要么我要求该应用程序的开发人员在我的 mbean 将访问的数组列表中注册所有应用程序属性。

  2. 其次,如果有任何其他方式,例如开发人员只需要注册可编辑属性,我的 mbean 仍然可以访问可读/可编辑(r/w)应用程序属性。

现在,由于我不知道这些应用程序属性存储在 JVM 中的什么位置,有没有办法实现我的第二点,以便 mbean 只需要访问该对象并获取所有应用程序属性?

4

2 回答 2

1

似乎您在这里有一些相互矛盾的要求。

  1. 您想要更改应用程序中的最少代码。
  2. 您希望成为公开所有属性以进行读取和/或写入的原因。
  3. 您可能会或可能不会谈论System.getProperty(...). 如果不是,那么我猜您只是在谈论各种对象中的字段。

有(至少)两种方法可以做到这一点。在不知道您现在如何从源代码中导出 mbean 的情况下,我无法根据您的特定配置定制我的答案。我的回答将展示您如何使用我的SimpleJMX 包来公开您的属性。

如果您正在谈论,System.getProperty(...)那么您可以编写一个可以查询任何属性并返回值的 JMX mbean:

@JmxOperation(description = "Query for property")
public String queryForProperty(String name) {
   return System.getProperty(name);
}

相反,如果您需要从某个对象列表中导出字段,那么您要么必须为要导出的每个字段添加注释,要么必须编写通过委托导出字段的 bean。我看不到简单的方法,而且我知道没有任何软件包可以轻松地为您导出一系列对象,而无需提供有关要导出的内容和方式的某种信息。

使用 SimpleJMX,您可以通过注释字段或 get 方法来导出字段:

@JmxAttributeField(description = "Number of hits in the cache")
private int hitCount;
...

// this can also be specified as @JmxAttributeMethod on the getter/setter methods
@JmxAttributeMethod(description = "Number of misses in the cache")
private int getMissCount() {
    return missCount;
}

@JmxAttributeField支持一个isWritable = true允许由 JMX 设置的值。您还可以使用注释设置器@JmxAttributeMethod以使其可写。

如果您不想为每个类添加注释,那么您将不得不编写某种通过委托导出值的 JMX 容器类:

 public class JmxPublisher {
     private Class1 object1;
     private Class2 object2;
     ...
     public JmxPublisher(Class1 object1, Class2 object2) {
         this.object1 = object1;
         this.object2 = object2;
         ...
     }

     @JmxAttributeMethod(description = "Number of hits in the cache")
     public int getClass1HitCount() {
        return object1.getHitCount();
     }
     @JmxAttributeMethod(description = "Shutdown the background thread")
     public void setClass2Shutdown(boolean shutdown) {
        return object2.setShutdown(shutdown);
     }
     ...
 }
于 2012-06-21T17:48:54.843 回答
0

我也认为你应该更清楚地表达自己。
据我了解 - 为什么不提供一种查询远程应用程序的方法,并获取有关所有属性的信息,以及它们是只读、只写还是 RW?
这样在客户端应用程序的源代码中就不会提及属性列表——也许你应该让客户端应用程序的用户看到属性列表,让他编辑他可以编辑的属性,并阻止他编辑他不能的属性。

于 2012-06-21T16:11:10.953 回答