общий интерфейс для доступа к библиотекам в нескольких WAR - это возможно в jboss? - PullRequest
2 голосов
/ 21 июня 2011

В качестве фона - я использую JBoss 5.1 для веб-приложений. Приложения развернуты вертикально, поэтому каждая функция заканчивается отдельным файлом WAR. У этого есть файл фляги для дао и бизнес-логики. Пока это нормально, но мне нужно развернуть другое приложение, которое не имеет много логики само по себе - это в основном вид, как, скажем, панель инструментов. Информационная панель должна собирать данные от разных поставщиков данных (обычно это другие приложения / функции). Сейчас приборная панель знает слишком много о других функциях. Таким образом, каждый раз, когда добавляется новая функция, эта панель инструментов также развертывается с соответствующими добавлениями кода.

Было бы замечательно, если бы для этой панели мониторинга был общий интерфейс, который реализуется немногими другими функциями, и при каждом развертывании новой функции (WAR) панель мониторинга также может динамически получать данные от нового поставщика. Это возможно? Если нет, то что мне ближе всего без манипулирования загрузчиками классов для приложений? Было бы хорошо узнать, возможно ли это в первую очередь внутри jboss.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

1 Ответ

1 голос
/ 21 июня 2011

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

Относительно быстрое решение - использовать сервер портала, такой как GateIn . Ваши WAR могут отображаться на той же странице, но они будут в отдельных местах и ​​не интегрированы. Вам нужно будет превратить ваши WAR в портлеты и попросить администратора добавить их в пользовательский интерфейс портала, но портал сможет сканировать и обнаруживать все доступные портлеты.

Более гибким решением было бы, чтобы один из ваших классов для каждого развертывания реализовывал общий интерфейс MBean. Ваша панель мониторинга может затем использовать JMX, в частности метод javax.management.MBeanServerConnection queryMBeans, чтобы получить все MBean-компоненты (или подмножество MBean-компонентов, принадлежащих определенному пакету, которые вы можете указать в качестве параметра запроса). Затем вы можете выполнять методы интерфейса с помощью метода javax.management.MBeanServerConnection invoke. Чтобы получить MBeanServerConnection с JBoss, позвоните org.jboss.mx.util.MBeanServerLocator.locateJBoss().

Некоторая дополнительная информация в соответствии с запросом (обратите внимание, что ниже приведена спецификация JBoss):

1) Превратите ваши развертывания в MBean Для каждого из ваших файлов JAR добавьте файлы jboss-service.xml и *-xmbean.xml в каталог META-INF (где * - это имя по вашему выбору). Следуйте этому примеру для этих файлов.

Реализация MBean по любому пути, который вы указали в атрибуте code элемента jboss-service.xml mbean (в нашем примере org.jboss.chap2.xmbean.JNDIMap). Укажите согласованное пространство имен и параметр для атрибута name элемента jboss-service.xml mbean (в примере chap2.xmbean:service=). Операции и атрибуты, которые вы указываете в файле *-xmbean.xml, должны точно соответствовать вашему интерфейсу.

2) Создайте панель мониторинга и в одном из ее классов опрашивайте сервисы (этот код не был протестирован, но должен предоставить хорошую схему)

//Get the connection
MBeanServerConnection connection = org.jboss.mx.util.MBeanServerLocator.locateJBoss();

//Query for MBeans in the chap2.xmbean namespace
Set<ObjectInstance> mbeans = connection.queryMBeans(null, new ObjectName("chap2.xmbean:service=*"));

//Loop over each MBean and invoke an interface method
for (ObjectInstance mbean : mbeans)
{
    //Invoking 'put' method from example. If this were an info method, this would return the result of the MBean operation
    connection .invoke(mbean.getObjectName(), "put", new Object[] {"TestKey", "TestValue"}, new String[] {Object.class.getName(), Object.class.getName()});
}
...