Как искать местный боб в wildfly с jndi

1

У меня есть тот же вопрос, что и поиск WildFly JNDI для локального EJB, развернутого на войне, за исключением того, что я не могу заставить его работать.

У меня есть ухо с EJB, развернутыми в jars-server-ejb3. В моем приложении я хочу вызвать метод для bean-компонента. Я пробовал это с помощью и без @LocalBean на моем bean-компоненте.

Когда начинается wildfly (8.2), он печатает:

java:global/jaws/jaws-server-ejb3/ForecastService!com.termalabs.common.service.ForecastServiceRemote
java:app/jaws-server-ejb3/ForecastService!com.termalabs.common.service.ForecastServiceRemote
java:module/ForecastService!com.termalabs.common.service.ForecastServiceRemote
java:jboss/exported/jaws/jaws-server-ejb3/ForecastService!com.termalabs.common.service.ForecastServiceRemote
java:global/jaws/jaws-server-ejb3/ForecastService
java:app/jaws-server-ejb3/ForecastService
java:module/ForecastService

Когда я добавляю @LocalBean в свой bean-компонент, я вижу:

java:global/jaws/jaws-server-ejb3/ForecastService!com.termalabs.server.service.ForecastService
java:app/jaws-server-ejb3/ForecastService!com.termalabs.server.service.ForecastService
java:module/ForecastService!com.termalabs.server.service.ForecastService
java:global/jaws/jaws-server-ejb3/ForecastService!com.termalabs.common.service.ForecastServiceRemote
java:app/jaws-server-ejb3/ForecastService!com.termalabs.common.service.ForecastServiceRemote
java:module/ForecastService!com.termalabs.common.service.ForecastServiceRemote
java:jboss/exported/jaws/jaws-server-ejb3/ForecastService!com.termalabs.common.service.ForecastServiceRemote

Так что из всего, что я прочитал, кажется очевидным, что я должен найти этот компонент с помощью "java: app/jaws-server-ejb3/ForecastService" или "java: app/jaws-server-ejb3/ForecastService! Com.termalabs.common.service.ForecastServiceRemote"

Вот мой поиск, который я сейчас сильно закодировал:

public static Object getBeanInternal(String beanName, Class remoteClass) throws NamingException {
    System.out.println("Getting internal bean: " + beanName + " for class "  + remoteClass.getName());
    final Hashtable jndiProperties = new Hashtable();
    jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
    InitialContext ctx = new InitialContext(jndiProperties);
    Object ejb = ctx.lookup("java:app/jaws-server-ejb3/ForecastService");
//    Object ejb = ctx.lookup("java:global/jaws-server-ejb3/ForecastService!com.termalabs.common.service.ForecastService");
    return ejb;
}

Я пробовал это с пустой таблицей jndiProperties или с приведенным выше значением. Независимо от того, что я пробовал, я получаю исключение NamingException, например

2015-04-07 15:50:01,836 WARN  [com.termalabs.server.system.AutosysJammerSequence] (JammerManager-2015/04/07 15:49:46.710 MDT-0) Can't lookup: javax.naming.NameNotFoundException: java:app/jaws-server-ejb3/ForecastService
    at org.jboss.as.naming.InitialContext$DefaultInitialContext.findContext(InitialContext.java:187)
    at org.jboss.as.naming.InitialContext$DefaultInitialContext.lookup(InitialContext.java:231)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:188)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:184)
    at javax.naming.InitialContext.lookup(InitialContext.java:417) [rt.jar:1.8.0_25]
    at javax.naming.InitialContext.lookup(InitialContext.java:417) [rt.jar:1.8.0_25]
    at com.termalabs.common.ejb3.EJB3Util.getBeanInternal(EJB3Util.java:55) [jaws-common-ejb3intf-1.0.jar:]
    at com.termalabs.server.system.AutosysJammerSequence.runJammerSequence(AutosysJammerSequence.java:427) [jaws-server-base-5.1dev.jar:]
    at com.termalabs.server.system.JammerSequence.run(JammerSequence.java:125) [jaws-server-base-5.1dev.jar:]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [rt.jar:1.8.0_25]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [rt.jar:1.8.0_25]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_25]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_25]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_25]

Я могу добраться до этого компонента, используя удаленный интерфейс, но это не кажется правильным, поскольку я запускаю этот код из того же уха. Мне не нужно это делать.

Что мне не хватает?

Благодаря,

Майкл

  • 1
    Код, в котором вы хотите искать и использовать EJB, развернутый в том же развертываемом модуле, например, в той же самой войне? Если так, зачем использовать JNDI для поиска, если вместо этого вы можете ввести его с помощью «@Inject" или «@EJB»?
  • 0
    Я просто хотел отметить, что в вашем закомментированном поиске вы указали «java: global» вместо «java: app». Не знаю, поможет ли это.
Показать ещё 1 комментарий
Теги:
wildfly
jndi
ejb-3.0

1 ответ

3
Лучший ответ

Глядя на сообщение, я вижу JammerManager-2015/04/07 15:49:46.710 MDT-0 который выглядит так, будто вы запускаете свой собственный поток. Если вы не используете новые утилиты параллелизма EE, скорее всего, контекст именования не копируется в ваш поток. Вам нужно убедиться, что для вашего нового потока установлен ваш контекст именования, контекст безопасности и TCCL.

  • 0
    Это имеет смысл. Я посмотрю на это, как только вернусь из отпуска. Спасибо!
  • 0
    Ты прав. Я могу получить доступ к моему бину из родительского потока, но не из моего нового потока. Кажется, у меня есть 2 варианта: 1) переписать все мои потоки, используя JBoss / JavaEE API. Это явно предпочтительнее, за исключением того, что мы затрудняемся в обход стандартного CDI и использования GUICE. И это было бы довольно навязчиво. 2) Делайте, как вы говорите, и копируйте в моем контексте именования, контексте безопасности и TCCL. У вас есть указатели, которые бы показали, как это сделать? Мне не очень повезло с Google. Еще раз спасибо.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню