Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как отличить 2 приложения? 
:(
    Опции темы
Wanttoknow
Дата 24.9.2009, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 28.2.2005

Репутация: нет
Всего: нет



Итак, 2 приложения развернуты под jboss.
Оба эти приложения используют класс, которых находится в lib jboss'a.
Вопрос: как классу узнать, какое приложение его вызывает? чем они отличаются?

Thread.currentThread().getContextClassLoader() не подходит. Он выдает разные значения и для одного приложения.

Спасибо!
PM MAIL   Вверх
Shurr
Дата 24.9.2009, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 24.10.2006

Репутация: 1
Всего: 7



Описание проблемы наводит на мысли об ошибке дизайна системы. А так, если размышлять отвлеченно - способов немеряно. 

Если это два инстанса одного и того же приложения - можно указать разные идентификаторы приложения в каком-нибудь из файлов-дескрипторов, web.xml, или еще каком. Дальше при подъеме этого приложения эта информация читается и ложится в конфигурационный объект, доступный из искомого класса.

Если это вообще разные приложения - тогда начиная от предыдущего метода (только можно уже не пользоваться файлами дескрипторов), и заканчивая проверкой через попытку создания инстанса класса, специфичного для конкретного приложения.
PM MAIL   Вверх
garbuz
Дата 24.9.2009, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Самый тупой способ - добавить еще один аргумент в метоже, куда передавать ид приложения.
PM MAIL   Вверх
Wanttoknow
Дата 25.9.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 28.2.2005

Репутация: нет
Всего: нет



Видимо я не очень хорошо сформулировал вопрос.

Ситуация следующая: я хочу использовать логирование с помощью log4j. Каждое отдельное приложение развернутое на JBoss'e должно использовать свои конфигурации для логирования (например, для того, чтобы писать логи каждое в свой файл).
Для этого я создал свой ContextRepositorySelector (заимплементил интерфейс RepositorySelector), который создает по LoggerRepository для каждого приложения, используя его конфигурационный log4j.xml.

У этого класса есть метод getRepositorySelector(), который вызывается при любом обращении к LogManager'y.
Так вот как я внутри этого метода могу определить из какого приложения был потревожен LogManager (чтобы вернуть сконфигурированный именно для этого приложения LoggerRepository)?

Спасибо, что откликаетесь!
PM MAIL   Вверх
Shurr
Дата 25.9.2009, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 24.10.2006

Репутация: 1
Всего: 7



Wanttoknow, 
Я не работал именно с JBoss, но, насколько я понимаю, каждое приложение загружается отдельным classloader'ом. Т.е. они не пересекаются по загруженным классам, даже если используют общие библиотеки.

Соответственно каждое приложение будет иметь свой инстанс ContextRepositorySelector, который сможет поднять только один log4j.xml, специфичный именно для данного приложения. И вопросов, какой именно LoggerRepository отдавать тоже не будет, т.к. в одном приложении он будет создан только один.

Или же используется не просто общая библиотека, а некий сервис, предоставляемый JBoss Application Server? И при этом два приложения-таки пересекаются по классам? 
PM MAIL   Вверх
andyhomes
Дата 25.9.2009, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 14.7.2009

Репутация: 2
Всего: 2



Цитата(Shurr @  25.9.2009,  16:41 Найти цитируемый пост)
Я не работал именно с JBoss, но, насколько я понимаю, каждое приложение загружается отдельным classloader'ом.

По умолчанию, JBoss (4.2 по крайней мере) использует один класс-лоадер на все приложения.
Чтобы выделить приложению свой репозиторий нужно в jboss-app.xml установить значение в loader-repository примерно так:
Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss-app
    PUBLIC "-//JBoss//DTD J2EE Application 4.2//EN"
    "http://www.jboss.org/j2ee/dtd/jboss-app_4_2.dtd">

<jboss-app>
    <loader-repository>
        myproj.rcl:app=myproj.ear
    </loader-repository>
</jboss-app>

PM MAIL   Вверх
ivanovpv
Дата 30.9.2009, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 2
Всего: 28



Ошибка дизайна здесь не причем. Ситуация сильно напоминает работу клиента с сервлетом, когда необходимо на уровне сервера отличать какой клиент вызвал сервер.

Поступать нужно аналогично. Нужно вводить понятие сессии - уникального идентификатора клиента. А как его реализовать - способов масса. В духе Java было бы организация хэш таблицы вызовов сервера, который заполняется при инициации соединения (вызова) посредством Listener'а

Идентификатор клиента можно передавать явно при вызове библиотечного класса или как здесь уже говорили читать из дескриптора приложения. Можно в принципе навертеть что-нибудь из области Reflection (если вызывают разные приложения).


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0439 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.