Получение дополнительных свойств из пользовательского ресурса JNDI

У меня есть этот пользовательский ресурс JNDI, настроенный на моем сервере Glassfish:

введите здесь описание изображения

У меня также развернуто веб-приложение, и в какой-то момент я хочу получить значение, настроенное для дополнительного свойства «версия» моего пользовательского ресурса.

Мой заводской класс такой:

public class TestCRFactory implements ObjectFactory {

    @Override
    public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) {
        if (obj instanceof Reference) {
            Reference ref = (Reference) obj;
            Enumeration<RefAddr> addrs = ref.getAll();
            while (addrs.hasMoreElements()) {
                RefAddr addr = addrs.nextElement();
                if (addr.getType().equals("version")) {
                    String version = (String) addr.getContent();
                    System.out.println(version); // it shows me "1"
                }
            }
        }
    }
}

Если я ищу объект:

Context context = new InitialContext();
Object obj = context.lookup("test/TestCR");

Мой код работает, и я могу без проблем получить свойство «версия» в фабричном классе.

Но теперь я хочу получить свойство «версия» без поиска объекта и вызвать фабричный класс. Я просто хочу сделать что-то подобное через MBeanServer:

import javax.management.MBeanServer;
import java.lang.management.ManagementFactory;
import javax.management.ObjectName;

...
boolean existsObject = false;
String name = "amx:pp=/domain/resources,type=custom-resource,name=test/TestCR";
ObjectName objName = new ObjectName(name);
try {
    MBeanServer mbean = ManagementFactory.getPlatformMBeanServer();
    existsObject = mbean.getObjectInstance(objName) != null; // this line works
    if (existsObject) {
       Object attr = mbean.getAttribute(objName, "version"); // this line doesn't work. it doesn't give me the "version" property I want.
    }
} catch (Throwable e) {
    existsObject = false;
}

У меня вопрос: что я делаю не так? Должен ли я помещать имя свойства в конец переменной name? Или что-то вроде того?


person Pedro Estevao    schedule 30.12.2013    source источник
comment
Я не вижу здесь ничего, связанного с JNDI. Пожалуйста, покажите это. Также, пожалуйста, опишите точную проблему, с которой вы столкнулись.   -  person PM 77-1    schedule 31.12.2013
comment
@ PM77-1 Думаю, теперь я стал лучше.   -  person Pedro Estevao    schedule 31.12.2013
comment
+1 за отличное описание   -  person PM 77-1    schedule 31.12.2013


Ответы (1)


Я понял!

Просто используя метод getAttribute следующим образом:

getAttribute("amx:pp=/domain/resources/custom-resource[test/TestCR],type=property,name=version", "Value");

Итак, мой окончательный код был:

boolean existsObject = false;
ObjectName objName = new ObjectName("amx:pp=/domain/resources,type=custom-resource,name=test/TestCR");
try {
    MBeanServer mbean = ManagementFactory.getPlatformMBeanServer();
    existsObject = mbean.getObjectInstance(objName) != null;
    if (existsObject) {
       Object attr = mbean.getAttribute("amx:pp=/domain/resources/custom-resource[test/TestCR],type=property,name=version", "Value");
       // here 'attr' var is indicating '1', as I've set! (I tested with other values too) 
    }
} catch (Throwable e) {
    existsObject = false;
}
person Pedro Estevao    schedule 06.01.2014