Как получить «сервис JBoss» с CDI в JMX с AS6? - PullRequest
3 голосов
/ 17 июля 2011

В настоящее время я переношу класс обслуживания JBoss из AS5.1 в AS6 (по разным причинам не собираюсь в AS7).

Для AS5.1 служба реализует MBean {serviceName} и имеет jboss-service.xml со значениями атрибутов.Он упакован в jboss-sar, который упакован в EAR для развертывания.При развертывании поля службы заполняются значениями из jboss-service.xml, и служба автоматически регистрируется в JMX.

Я хотел бы добиться того же, используя AS6, но хотел бы, чтобы службаподдержка CDI - так что я бы хотел, чтобы новые точки ввода @Inject были удовлетворены.Мне нужно, чтобы они были удовлетворены в объекте, зарегистрированном в JMX, чтобы методы, вызываемые через JMX, могли ссылаться на введенные поля, но я изо всех сил пытаюсь достичь этого.

Мне пришлось упаковать службу в банкувместо jboss-sar по причинам загрузчика классов, но допустим, что в остальном он не изменился.При развертывании в AS6 все работает как прежде - служба переходит в JMX, значения из XML распространяются на объект.Однако созданный экземпляр не имеет своих точек ввода CDI и объекта, зарегистрированного в JMX.

Если я аннотирую класс обслуживания с помощью @Startup и @ javax.ejb.Singleton, но сохраню его интерфейси jboss-service.xml, объект, зарегистрированный в JMX, все еще не имеет своих точек ввода CDI.Однако, если я программно отменил регистрацию этого bean-компонента и заново зарегистрировал экземпляр в методе @PostConstruct, то bean-компонент в JMX ДОЛЖЕН иметь свои точки внедрения.Однако этот компонент больше не имеет значений, указанных в jboss-service.xml.

Итак, как я могу получить лучшее из обоих миров?CDI и обычное поведение сервиса JBoss?Как правильно реализовать сервис JBoss с CDI?Я не смог найти документацию по этому вопросу.Надеюсь, что кто-то может помочь.

Спасибо,

Бен

Ответы [ 2 ]

1 голос
/ 20 июля 2011

Как упомянуто в комментариях выше, кажется, что Том прав: нет «красивого» способа создания CDIed, JMX bean за один раз, вы должны либо поместить свой JMX bean в CDI, как предложено выше, либо поставить Вы CDIed боб в JMX. Мы попробовали первый, но похоже, что BeanManager не привязан к JNDI в момент запуска службы.

Так что вместо этого мы пошли с компонентом CDI -> JMX. Мы создаем сервисы как Singleton EJB, поэтому их точки внедрения удовлетворяются, и они затем регистрируются / незарегистрируются в JMX в своих методах PostConstruct / PreDestroy, используя превосходное портативное расширение CDI немецкого Escobar -portable-extension-jmx.html, community.jboss.org/thread/148750 также полезен).

Однако можно попытаться использовать бины ApplicationScoped и запустить их, наблюдая событие ContainerInitialized (?), Так как нам не нужны все функции EJB. Еще не попробовал, ум ...

1 голос
/ 17 июля 2011

В качестве наихудшего варианта вы должны иметь возможность использовать API расширения CDI , чтобы получить доступ к своему сервису. Я не думаю, что вам нужно написать полноценное расширение, но если у вас есть хук инициализации в сервисном объекте, вы можете сделать это (снято с незначительным редактированием из документов, не скомпилировано или протестировано):

public static <T> void inject(T object) {
    BeanManager beanManager = (BeanManager)new InitialContext().lookup("java:comp/BeanManager");
    AnnotatedType<T> type = beanManager.createAnnotatedType(object.getClass());
    InjectionTarget<T> it = beanManager.createInjectionTarget(type);
    CreationalContext ctx = beanManager.createCreationalContext(null);
    it.inject(object, ctx);
    it.postConstruct(object);
}

По сути, любой объект этого метода будет введен. Все обычные аннотации CDI должны работать. Будем надеяться.

...