от

Получение значений переменных WebSphere в коде

Хранение и получение конфигурационных данных — типичная задача для разработчика. Можно хранить данные в базе, но в некоторых случаях удобным инструметом является хранение конфигурации в настраиваемых на уровне сервера переменных. Удобно, что при многосерверной конфигурации их можно настроить в разных областях видимости, так что каждый сервер при необходимости получит свои собственные значения. В случае с вебсферой выбор обычно падает на строковые Name space bingings. Второй вариант — переменные вебсферы — WebSphere variables. Рассмотрим как они настраиваются и извлекаются в рантайме.

Name space bingings

Путь в меню: Environment > Naming > Name space bindings. В выпадающем списке выбирается область видимости, нажимается New.
Screenshot from 2015-01-26 12:33:03

Затем заполняется идентификатор, часть JNDI-имени, по которому в дальнейшем запись можно получить, и собственно значение.
Screenshot from 2015-01-26 12:33:39

После этого список биндингов выглядит примерно так.
Screenshot from 2015-01-26 12:33:58

Получить сконфигурированную в консоли строку в коде очень просто. Если не рассматривать обработку ошибок — это 1-2 строки — поиск через JNDI.

    public static String getString(String name) throws NamingException {
        Context ic = new InitialContext();
        return  (String) ic.lookup(name);
    }

WebShphere variables

В WebSphere предусмотрено и другое место хранения настраиваемых переменных. Это WebShphere variables. Там хранятся многие системные значения, используемые самой вебсферой — пути до библиотек и т.п. Например, нам нужно получить имя текущего сервера для отсылки информации об ошибке администратору. В WebSphere 8+ можно было бы прибегнуть к стандартному для J2EE-серверов пути, получив имя сервера через JNDI, но в седьмой версии вебсферы это не работает. Поэтому мы можем получить значение переменной WAS_SERVER_NAME.

Путь в административной консоли — Environment > WebSphere variables. Интерфейс практически идентичен. Такие же правила относительно областей видимости.
Screenshot from 2015-01-26 13:16:07

Код будет несколько сложнее, нужно обращаться к managed bean, как если бы мы работали через wsadmin.

    private static String expandVariable(String name) throws JMException {

        String result = "";
        try {
            AdminService adminService = AdminServiceFactory.getAdminService();
            ObjectName queryName = new ObjectName("WebSphere:*,type=AdminOperations");
            Set objs = adminService.queryNames(queryName, null);
            if (!objs.isEmpty()) {
                ObjectName thisObj = (ObjectName) objs.iterator().next();
                String opName = "expandVariable";
                String signature[] = { "java.lang.String" };
                String params[] = { "${" + name + "}" };
                Object retVal = adminService.invoke(thisObj, opName, params, signature);
                if (retVal instanceof String) {
                    result = (String) retVal;
                }
            }
        } catch (MalformedObjectNameException e) {
            //...
        } catch (InstanceNotFoundException e) {
            //...
        } catch (MBeanException e) {
            //...
        } catch (ReflectionException e) {
            //...
        }
        return result;
    }

В зависимости от контекста исполнения может потребоваться выполнить этот код с привилегиями администратора. Для этого может потребоваться выпалнить программный логин. Это отдельная тема, которая разбирается, например, здесь

Write a Comment

Комментарии