среда, 22 октября 2008 г.

Ещё одна странность JBoss

Почемута JDBC драйвер для PostgreSQL выложенный в папку /lib приложения подцепляется неправильно. /*Сдаётся мне проблема в извращённом класслодинге и/или том хаке, который я описывал простом раньше*/ При обращении выдаёт ошибку в духе: "неправильный драйвер для такой строки соединения". Лечение тривиально - положить жарник с драйвером в /lib сервера.

Раздельные логи приложений в JBoss

Встала задача организовать раздельную запись логов для нескольких экземпляров одного и того-же приложения, запущенных на сервере(разделение экземпяров просто переименование war-ок). При этом дополнительно хотелось получить также: конфигурирование логов отдельно от самого сервера(читай не в серверном jboss-log4j.xml, а в собственном конфиге приложения, один экземпляр log4j как на диске, так и в памяти.

Простая упаковка конфига вместе с приложением успеха, как и ожидалось, не принесла. Если верить форумам/мэйллистам причина в том, что по умолчанию JBoss подкладывает приложениям свои библиотеки в класспат, соответственно приложения используют уже инициализированный экземпляр log4j.
Вторым этапом стала попытка использовать хак со слушателем контекста и установкой в нём RepositorySelector'а взятый тут, раздел 10.3.8(что примечательно попал он мне на глаза сначала в каком-то блоге, а не в оф. доке). Работал он плохо: при переразвёртываниии приложения падала ошибка при инициализации JBoss log4j plugin. Думаю из за того, что при этом старый ClassLoader убивается и все созданные им классы вместе с ним. Заниматься дебагом сервера было немного лень, а сообщение обошибке было, мягко говоря, кратким.
В третий заход применил подход описанный там-же в разделе 10.3.6. А именно: положил в папку WEB-INF/lib log4j и commons-logging(в своём приложении на всякий случай решил использовать его, а не напряму log4j), положил в папку WEB-INF/classes свой log4j.xml а также создал файлик jboss-web.xml(до этого обходился стандартным дескриптором) с содержимым, описанным в доке чуть ниже.
Потом ещё переучил оставшийся с прошлой попытки листенер записывать в системные свойства имена приложения(точнее контекста) и конфига(log4j.xml). /*В спринге есть специальный, более одарённый листенер для этих целей, но спринга пока в проекте нет и связываться было лень.*/
Commons-logging увидел старшого брата без дополнительных манипуляций.

Результат: аккуратненький набор папочек в /log сервера с подневными логами соответствующих приложений. Надо отметить, что это, между тем, не совсем нирвана ибо экземпляр log4j на каждое приложение - и память не по делу и место на диске... в эпоху гигабайтных планок не сильно проблемно, но всё-таки. Есть мнение, что если поглубже покопать в серверный класслоадинг
(точнее хоть чуть-чуть копнуть, ибо то, что вписал в конфигурашку я понял приближённо) можно её и достичь...

Начало

Завожу блог для всяческих технических заметок и хаутушек. Планирую писать сюда отчёты по всему более-менее нетривиальному, постигнутому на ниве кодинга.
Основная мотивировка - масса времени потраченного в последнее время на повторение пройденного, да может ещё кому пригодится...