使用JMX注册和更新应用程序属性

时间:2012-06-21 15:59:26

标签: java properties jmx

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

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

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

  3. 既然我不知道这些应用程序属性存储在JVM中的哪个位置,有没有办法实现我的第二点,以便mbean只需要访问该对象并获得所有应用程序属性?

2 个答案:

答案 0 :(得分:1)

好像你在这里有一些矛盾的要求。

  1. 您想要更改应用程序中的最小代码。
  2. 您希望成为公开所有读取和/或写入属性的原因。
  3. 您可能会或可能不会谈论System.getProperty(...)。如果没有,那么我想你只是谈论各种对象中的字段。
  4. 至少有两种方法可以做到这一点。在不知道如何从源代码中导出mbeans的情况下,我无法根据您的特定配置定制我的答案。我的答案将显示如何使用我的SimpleJMX package来公开您的属性。

    如果您正在讨论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注释setter以使其可写。

    如果您不想为每个类添加注释,那么您将不得不编写某种通过委托导出值的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);
         }
         ...
     }
    

答案 1 :(得分:0)

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