понедельник, 26 апреля 2010 г.

Настройки в EAR-приложениях под JBoss

Любое приложение, сложнее чем HelloWorld, требует некоторых настроек для своей работы. В приложениях, что мне приходится делать под JBoss, я использовал следующий механизм.

Существует стандартный MBean-сервис, который позволяет разместить в JNDI некоторые объекты. Реализация этого сервиса - org.jboss.naming.JNDIBindingServiceMgr. Разместив некоторые объекты в JNDI, их потом очень легко достать в EJB-бинах. Собственно, этим и воспользуемся.

Сначала нужно определить сервис JNDIBindingServiceMgr. В папке META-INF ear-архива (или папки) необходимо создать файл, оканчивающийся на -service.xml. Например, jndisettings-service.xml. Внутри этого файла определяем сервис JNDIBindingServiceMgr, как на примере ниже:

<?xml version="1.0" encoding="windows-1251"?>

<server>
    <mbean code="org.jboss.naming.JNDIBindingServiceMgr"
           name="com.blogspot.j2ee-rus:name=Settings">
        <attribute name="BindingsConfig" serialDataType="jbxb">
            <jndi:bindings
                    xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
                    xmlns:jndi="urn:jboss:jndi-binding-service:1.0"
                    xs:schemaLocation="urn:jboss:jndi-binding-service:1.0 resource:jndi-binding-service_1_0.xsd">

                <jndi:binding name="j2ee-rus/settings/hello-world-word">
                    <jndi:value>Hello World</jndi:value>
                </jndi:binding>

                <jndi:binding name="j2ee-rus/settings/goodbuy-world-word">
                    <jndi:value>Goodbuy World</jndi:value>
                </jndi:binding>

            </jndi:bindings>
        </attribute>
    </mbean>

</server>

В этом XML-е нет ничего сложного. Первое "com.blogspot.j2ee-rus:name=Settings" - это имя MBean-а, соответствующего сервису. Имя может быть произвольным, но общая рекомендация - оно должно отражать суть). Второе - в файле прописаны 2 параметра настроек, которые после запуска сервиса будут доступны через JNDI. JNDI-пути также могут быть достаточно произвольными, я придерживаюсь обычно структуры пути "модуль/логический компонент/название параметра". В данном примере я использую 2 пути - "j2ee-rus/settings/hello-world-word" и "j2ee-rus/settings/goodbuy-world-word".

Отлично, теперь, если запустить EAR, то JBoss-сервис org.jboss.naming.JNDIBindingServiceMgr также установится как MBean и будет доступен по адресу com.blogspot.j2ee-rus:name=Settings (это можно посмотреть через JConsole).

Далее, чтобы получить значения из JNDI в EJB-бинах, нужно определить внутри бина контекст:
    @Resource
    private EJBContext context;

А чтобы достать некоторый объект из JNDI, используем следующую конструкцию:
        String helloWorld = (String) context.lookup("j2ee-rus/settings/hello-world-word");
        String goodbuyWordl = (String) context.lookup("j2ee-rus/settings/hello-world-word");

Вот, собственно, и все! Еще одно замечение - когда EAR вместе с сервисом настроек установлен под JBoss, после изменение файла с настройками (jndisettings-service.xml) происходит автоматический redeploy всего EAR-приложения! В большинстве случаев - это как раз и требуется.