2012-06-21 2 views
0

Мне нужно получить доступ к некоторому приложению через mbean, чтобы я мог изменить его свойства приложения. Теперь я думаю, что это может быть сделано двумя способами:Регистрация и обновление свойств приложения с помощью JMX

  1. Во-первых, как я прошу разработчик этого приложения, чтобы зарегистрировать все свойства применения в ArrayList, который мой MBean будет иметь доступ.

  2. Во-вторых, если есть какой-либо другой способ, так что разработчику нужно будет только регистрировать редактируемые свойства, и все же моя mbean может получить доступ к как доступным для чтения, так и редактируемым (r/w) свойствам приложения.

Теперь, так как я не знаю, где эти свойства приложения хранятся в JVM, есть способ реализовать свою вторую точку, так что MBean просто нужно, чтобы получить доступ к этому объекту, и он будет получать все заявки свойства?

+0

Пожалуйста, попробуйте выразить лучше ваш вопрос. Трудно читать и понимать большую часть неотформатированного текста ... – JuanZe

+0

Что вы подразумеваете под «свойством»? Вы говорите системное свойство или поле объекта или что-то еще? – Gray

ответ

0

Я также считаю, что вы должны выразить себя более четко.
Из чего я понял - почему бы не предоставить способ запросить удаленное приложение и получить информацию обо всех свойствах, и если они доступны только для чтения, записи или RW?
Таким образом, список свойств не будет упоминаться в исходном коде клиентского приложения - возможно, вы должны позволить пользователю клиентского приложения просмотреть список свойств и позволить ему редактировать свойства, которые он может редактировать, и предотвратить его от редактирования свойств, которые он не может.

+0

Я извиняюсь за беспорядочный внешний вид моего вопроса ... я напишу его поточечно. – user1472629

+0

@zaske ... откуда я могу получить все свойства приложения? – user1472629

1

Похоже, что у вас есть некоторые противоречивые требования здесь.

  1. Вы хотите изменить минимальный код в приложении.
  2. Вы хотите, чтобы выставляли все свойства для чтения и/или записи.
  3. Возможно, вы говорите о System.getProperty(...). Если нет, то я предполагаю, что вы говорите только о полях в разных объектах.

Существует (по крайней мере) два способа сделать это. Не зная, как вы экспортируете mbeans из исходного кода прямо сейчас, я не могу адаптировать свой ответ к вашей конкретной конфигурации. Мой ответ вместо этого покажет, как вы можете использовать мой SimpleJMX package, чтобы разоблачить ваши свойства.

Если вы говорите о System.getProperty(...), то вы можете написать JMX MBean, который может запросить любое имущество и вернуть значение:

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

Если, вместо этого, вам нужно экспортировать полей из некоторого списка объектов, то вам придется либо добавлять аннотации к каждому из полей, которые вы экспортируете, либо вам придется писать бобы, которые экспортируют поля через делегирование. Я не вижу легкого пути, и я не знаю ни одного пакета, который будет легко экспортировать ряд объектов для вас без какой-либо информации о том, что нужно экспортировать и как.

Использование 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); 
    } 
    ... 
} 
+0

: - Спасибо, серый .., но именно то, что я просил, могло бы предложить мне любой другой способ получить доступ ко всем свойствам java-приложений уже существующего приложения Java с минимальными изменениями исходного кода. – user1472629

+0

Что такое "java application properties"? Я пытался это сделать с моим ответом. – Gray

+0

@Gray Понравилась простая реализация JMX. –