В настоящее время мы переносим некоторые из наших проектов из JBoss 4.x в JBoss 7. Пока все работает нормально, за исключением наших MBeans, которые мы обычно используем для обеспечения простых операций управления.
Я искал довольно долгое время, но либо я не способен выполнить правильный поисковый запрос, либо я пропускаю часть знаний, чтобы устранить разрыв между определением MBean в JBoss 4.x и JBoss 7.
Таким образом, мы надеемся, что кто-то может дать нам подсказку о том, что мне может не хватать, или где мне нужно будет читать (возможно, какую-то документацию, примеры и т.д.)
В Jboss 4.x наши MBeans часто выглядят так:
@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 (я в настоящее время использую порт Dimitris Andreadis)
- предоставить описания методов/параметров
Обновление
Вот что я получил до сих пор:
Сначала я нашел эту проекцию, которая использует CDI для переноса цели инъекции любого bean, который аннотируется соответственно, и регистрирует JMX в методе postConstruct()
: http://code.google.com/p/jmx-annotations/. Кроме того, найденные MBeans сканируются для аннотаций class/attribute/method/parameter, которые предоставляют описание для аннотированного свойства.
Однако метод postConstruct()
, кажется, не вызывается для EJB (я предполагаю, что это не для того, чтобы столкнуться с контейнером EJB). Таким образом, MBeans теперь не должны быть EJB, а просто CDI beans.
Таким образом, однако, имеет недостаток, что MBeans не создаются автоматически. Чтобы преодолеть это, существует singleton bean, который при запуске проходит через все beans в BeanManager
и создает экземпляр каждого найденного MBean. Поскольку у MBeans все еще есть цель для инъекций, его метод postConstruct()
не будет вызван, а bean будет зарегистрирован на сервере MBean.
Ниже приведен краткий обзор процедуры запуска:
- пользовательское расширение CDI сканирует каждый CDI bean для пользовательской аннотации @MBean
- для каждого интеллигентного MBean, который нацелен на инъекцию.
- будет запущен singleton bean, который в своем методе @PostConstruct создаст экземпляры MBeans
- будет вызван метод
postConstruct()
целевой цели внедрения MBean и, следовательно, MBean будет зарегистрирован на сервере MBean
Одним из недостатков этого метода будет отсутствующий контекст транзакции при выполнении методов MBean (любые вызовы EJB будут выполняться в контексте транзакции). Однако, это может быть исправлено с использованием перехватчика CDI, который будет обеспечивать контекст транзакции, если это необходимо. Для проекта Seam, похоже, есть соответствующие перехватчики.
Я все еще не уверен, что это разумный и стабильный подход, поэтому любые конструктивные комментарии, подсказки и т.д. более чем приветствуются.