в настоящее время мы переносим некоторые из наших проектов с JBoss 4.x на JBoss 7. Пока что, похоже, все работает нормально, за исключением наших MBean-компонентов, которые мы обычно используем для обеспечения простых операций управления.
Я уже довольно давно искал, но либо я не могу найти правильный поисковый запрос, либо мне не хватает некоторых знаний, чтобы преодолеть разрыв между определением MBean в JBoss 4.x и JBoss 7.
Таким образом, надеюсь, кто-нибудь сможет подсказать, что мне может не хватать или где мне нужно будет прочитать (возможно, некоторая документация, примеры и т. Д.)
В Jboss 4.x наши MBean-компоненты часто выглядят так:
@Service( objectName = "Domain:Name=SomeMBean",
xmbean="resource:<path-to-xmbean.xml>")
class SomeMBean
{
@EJB
private SomeService someService;
public String someOperation()
{
someService.doSomething();
return "success";
}
}
Мы использовали аннотацию @Service
для определения имени объекта и дескриптора xmbean, и JBoss автоматически регистрировал эти mbeans.
По-видимому, в JBoss 7 аннотации @Service
больше не существует, и поэтому необходим другой подход.
До сих пор мне удавалось зарегистрировать MBean вручную на сервере mbean платформы, но я бы предпочел, чтобы JBoss делал это автоматически. Кроме того, мне до сих пор не удалось предоставить описания методов / параметров (хотя это более приятная функция).
Повторю вопрос для ясности:
Как мне определить MBean в JBoss 7 (Java EE 6), который предоставляет следующие функции?
- автоматическое развертывание
- доступ к EJB
- доступный через JConsole или JMX-Console (в настоящее время я использую порт Димитриса Андредиса)
- предоставить описания методов / параметров
Обновить
Вот что у меня получилось:
Во-первых, я нашел эту проекцию, которая использует CDI для обертывания цели инъекции любого bean-компонента, который аннотируется соответствующим образом, и выполняет регистрацию JMX в методе postConstruct()
: http://code.google.com/p/jmx-annotations/. Кроме того, найденные MBean-компоненты сканируются на предмет аннотаций класса / атрибута / метода / параметра, которые предоставляют описание аннотированного свойства.
Однако кажется, что метод postConstruct()
не вызывается для EJB (я предполагаю, что это необходимо для того, чтобы не конфликтовать с контейнером EJB). Таким образом, MBean-компоненты теперь должны быть не EJB-компонентами, а простыми CDI-компонентами.
Таким образом, однако, есть недостаток, заключающийся в том, что компоненты MBean не создаются автоматически. Чтобы преодолеть это, существует одноэлементный bean-компонент, который при запуске перебирает все bean-компоненты в BeanManager
и создает экземпляр каждого найденного MBean-компонента. Поскольку у MBean-компонентов все еще есть цель внедрения, его метод postConstruct()
не будет вызываться, и bean-компонент будет зарегистрирован на сервере MBean.
Вот примерный обзор процедуры запуска:
- настраиваемое расширение CDI сканирует каждый компонент CDI на предмет пользовательской аннотации @MBean
- для каждого понятного MBean-объекта цель инъекции оборачивается
- будет запущен одноэлементный компонент, который в своем методе @PostConstruct создаст экземпляры MBeans
- будет вызван метод
postConstruct()
целевого объекта внедрения MBean, и, таким образом, MBean будет зарегистрирован на сервере MBean.
Одним из недостатков этого метода является отсутствие контекста транзакции при выполнении методов MBean (любые вызовы EJB будут выполняться в контексте транзакции). Однако это можно исправить с помощью перехватчика CDI, который при необходимости предоставит контекст транзакции. В проекте Seam, похоже, есть для этого подходящие перехватчики.
Я все еще не уверен, что это разумный и стабильный подход, поэтому любые конструктивные комментарии, подсказки и т. Д. Более чем приветствуются.