![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Wanttoknow |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 28.2.2005 Репутация: нет Всего: нет |
Итак, 2 приложения развернуты под jboss.
Оба эти приложения используют класс, которых находится в lib jboss'a. Вопрос: как классу узнать, какое приложение его вызывает? чем они отличаются? Thread.currentThread().getContextClassLoader() не подходит. Он выдает разные значения и для одного приложения. Спасибо! |
|||
|
||||
| Shurr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 24.10.2006 Репутация: 1 Всего: 7 |
Описание проблемы наводит на мысли об ошибке дизайна системы. А так, если размышлять отвлеченно - способов немеряно.
Если это два инстанса одного и того же приложения - можно указать разные идентификаторы приложения в каком-нибудь из файлов-дескрипторов, web.xml, или еще каком. Дальше при подъеме этого приложения эта информация читается и ложится в конфигурационный объект, доступный из искомого класса. Если это вообще разные приложения - тогда начиная от предыдущего метода (только можно уже не пользоваться файлами дескрипторов), и заканчивая проверкой через попытку создания инстанса класса, специфичного для конкретного приложения. |
|||
|
||||
| garbuz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 8 Всего: 11 |
Самый тупой способ - добавить еще один аргумент в метоже, куда передавать ид приложения.
|
|||
|
||||
| Wanttoknow |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 28.2.2005 Репутация: нет Всего: нет |
Видимо я не очень хорошо сформулировал вопрос.
Ситуация следующая: я хочу использовать логирование с помощью log4j. Каждое отдельное приложение развернутое на JBoss'e должно использовать свои конфигурации для логирования (например, для того, чтобы писать логи каждое в свой файл). Для этого я создал свой ContextRepositorySelector (заимплементил интерфейс RepositorySelector), который создает по LoggerRepository для каждого приложения, используя его конфигурационный log4j.xml. У этого класса есть метод getRepositorySelector(), который вызывается при любом обращении к LogManager'y. Так вот как я внутри этого метода могу определить из какого приложения был потревожен LogManager (чтобы вернуть сконфигурированный именно для этого приложения LoggerRepository)? Спасибо, что откликаетесь! |
|||
|
||||
| Shurr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 24.10.2006 Репутация: 1 Всего: 7 |
Wanttoknow,
Я не работал именно с JBoss, но, насколько я понимаю, каждое приложение загружается отдельным classloader'ом. Т.е. они не пересекаются по загруженным классам, даже если используют общие библиотеки. Соответственно каждое приложение будет иметь свой инстанс ContextRepositorySelector, который сможет поднять только один log4j.xml, специфичный именно для данного приложения. И вопросов, какой именно LoggerRepository отдавать тоже не будет, т.к. в одном приложении он будет создан только один. Или же используется не просто общая библиотека, а некий сервис, предоставляемый JBoss Application Server? И при этом два приложения-таки пересекаются по классам? |
|||
|
||||
| andyhomes |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 14.7.2009 Репутация: 2 Всего: 2 |
По умолчанию, JBoss (4.2 по крайней мере) использует один класс-лоадер на все приложения. Чтобы выделить приложению свой репозиторий нужно в jboss-app.xml установить значение в loader-repository примерно так:
|
||||
|
|||||
| ivanovpv |
|
|||
![]() Варвар ![]() ![]() Профиль Группа: Участник Сообщений: 639 Регистрация: 26.1.2005 Где: Москва Репутация: 2 Всего: 28 |
Ошибка дизайна здесь не причем. Ситуация сильно напоминает работу клиента с сервлетом, когда необходимо на уровне сервера отличать какой клиент вызвал сервер.
Поступать нужно аналогично. Нужно вводить понятие сессии - уникального идентификатора клиента. А как его реализовать - способов масса. В духе Java было бы организация хэш таблицы вызовов сервера, который заполняется при инициации соединения (вызова) посредством Listener'а Идентификатор клиента можно передавать явно при вызове библиотечного класса или как здесь уже говорили читать из дескриптора приложения. Можно в принципе навертеть что-нибудь из области Reflection (если вызывают разные приложения). -------------------- Aut viam inveniam aut faciam |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |