23 марта 2013 г.

Работа с модулями JBoss 7 на примере log4j

Используются: Maven 3, JBoss 7.1, EJB 3.1, IntelliJ Idea 12 Ultimate, log4j 1.2.17.

В JBoss 6 достаточно было кинуть jar-файл в папку deploy или lib соответствующей конфигурации и вы уже могли использовать содержащиеся в архиве классы в своих компонентах.

В JBoss 7 значительно изменилась архитектура сервера приложений в целом. Теперь любой jar-файл библиотеки называется модулем. Он лежит в строго отведённом месте и снабжён конфигурационным файлом.

Давайте разберёмся, как можно использовать модули JBoss 7 в своих приложениях. Ранее мы уже создали при помощи maven простой EJB, которое что-то возвращает клиенту а также добавили к нему дополнительные maven-плагины. Теперь добавим к нему функционал библиотеки log4j.

Эта библиотека логирования уже доступна по умолчанию в JBoss 7.1 в виде модуля. Он находится в папке $JBOSS_HOME/modules/org/apache/log4j/main. В этой папке лежит jar-файл библиотеки и конфигурационный файл module.xml. Откроем его.
<module xmlns="urn:jboss:module:1.1" name="org.apache.log4j">
    <properties>
        <property name="jboss.api" value="private"/>
    </properties>
    <resources>
        <resource-root path="log4j-1.2.16.jar"/>
        <!-- Insert resources here -->
    </resources>
    <dependencies>
        <module name="org.dom4j" optional="true"/>
        <module name="javax.api"/>
    </dependencies>
</module>
Как видите, этот файл содержит информацию об имени модуля (атрибут name в секции module), информацию о jar-файле, а также зависимости этого модуля от других.

Добавим в наш pom-файл, в конфигурацию плагина maven-ejb-plugin секцию archive-manifestEntries-Dependencies. Там через запятую следует перечислять имена нужных нам модулей. В данном случае это один модуль с именем org.apache.log4j.
<archive>
<manifestEntries>
<Dependencies>
org.apache.log4j
</Dependencies>
</manifestEntries>
</archive>
Теперь после компиляции проекта в файле META-INF/MANIFEST.MF внутри собранного архива появится строка:
Dependencies: org.apache.log4j
JBoss 7 автоматически загрузит этот модуль при деплое нашего компонента. Модуль подключен, осталось его настроить и задействовать.

Положите в папку src/main/resources нашего maven-проекта конфигурационный файл log4j.xml. В эту папку нужно складывать любые файлы, которые могут потребоваться во время выполнения вашего приложения. Они будут автоматически добавлены в корень jar-архива.


Пример содержимого файла:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration debug="false" xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="utf-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ISO8601} [%-5p][%-16.16t][%32.32c] - %m%n" />
        </layout>
    </appender>

    <root>
        <priority value="INFO"/>
        <appender-ref ref="ConsoleAppender" />
    </root>

</log4j:configuration>

Здесь все сообщения с уровнем INFO и выше будут выводиться на консоль. Подробнее о настройках этой библиотеки и уровнях логирования я уже писал ранее.

В pom-файл в секцию dependencies нужно добавить зависимость этой библиотеки (не забудьте добавить в секцию properties актуальный номер версии библиотеки):
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>${version.log4j}</version>
</dependency>
Теперь осталось добавить пару строчек кода в наш класс SimpleBean. Объявим логгер как член класса.
private static final Logger logger = Logger.getLogger(SimpleBean.class);
Вызовем его из метода getMessage:
logger.info("SimpleBean invoked");
Полный текст класса SimpleBean:
package com.blogspot.developer.remarks;
import org.apache.log4j.Logger;
import javax.ejb.Stateless;
@Stateless
public class SimpleBean implements SimpleBeanRemote {
    private static final Logger logger = Logger.getLogger(SimpleBean.class);
    @Override
    public String getMessage() {
        logger.info("SimpleBean invoked");
        return "This message was generated by simple ejb";
    }
}
Таким образом, при вызове клиентом этого метода EJB, в консоли сервера появится соответствующее сообщение с уровнем INFO.

1 комментарий:

  1. Отлично описано, спасибо!
    А можно как-то получить список всех доступных приложению модулей?

    ОтветитьУдалить