2015-09-22 2 views
0

У нас есть EAR, содержащий несколько банок, модуль EJB и модуль WAR. Мы хотим получить класс с JNDI InitialContext.lookup от и до того же модуля EJB.jBoss EAR-EJB jndi java: global working, java: app NameNotFoundException

В консоли jBoss мы можем увидеть java: global с приложением, модулем и всеми классами внутри модуля. Если мы сделаем подобный поиск, это сработает. Существует также раздел приложений, который включает наш EAR с модулем и всеми классами внутри.

Теперь, когда наш EAR может иметь разные исполнения и, следовательно, разные двоичные имена, мы хотели использовать java: app, чтобы пропустить HardCoded AppName. К нашему удивлению, даже если приложение java: существует в JNDI-коннекторе JBoss, оно все время генерирует исключение NameNotFoundException. Мы также пытались использовать java: comp, java: module, java: app/env/... (даже если они не показаны на консоли jBoss), но ничего, кроме портативных имен, не работает.

Кто-нибудь знает, почему это может произойти?

private static final String MY_TIMER_SINGLETON = "java:global/myear-1.0.0-SNAPSHOT/mymoduleejb/MyTimerSingleton"; 

//private static final String MY_TIMER_SINGLETON = "java:app/mymoduleejb/MyTimerSingleton"; 

InitialContext ic = new InitialContext(); 
MyTimerSingleton t = (MyTimerSingleton) ic 
     .lookup(MY_TIMER_SINGLETON); 

JBoss консоль Profile-> container-> Нейминг:

java:jboss 
-... 

java:global 
-myear-1.0.0-SNAPSHOT 
    -mymoduleejb 
    -MyTimerSingleton 
    -... 

applications 
-myear-1.0.0-SNAPSHOT 
    -java:app 
    -mymoduleear 
    -MyTimerSingleton 
    -... 

EDIT 1: Дополнительная информация.

jBoss работает с использованием автономной конфигурации ha.xml.

Я пытаюсь получить Singleton через JDNI, потому что @EJB не работает в org.jboss.msc.service.Service classes.

Если я заставляю MyTimerSingleton реализовывать интерфейс @Remote или @Local, JNDI консоли JBoss становится пустым.

В любом случае, все .../окр/из списка JNDI пустые

ответ

1

Я принимаю MyTimerSingleton является EJB, если после этого вам не нужно JNDI, вы можете использовать @EJB аннотация, даже для вызова EJB из веб-модуля внутри уха.

... 
@Stateless 
public class OtherEJB { 
@EJB 
MyTimerSingleton myTimerSingleton; 
... 

Если вы wan't достичь слабосвязанной решения с использованием JNDI вызовов, попробуйте использовать mappedName свойство внутри @Stateless или @Singleton аннотацию в EJB MyTimerSingleton:

... 
import javax.ejb.Singleton; 
@Singleton(mappedName = "MyTimerSingleton") 
public class MyTimerSingleton implements MyTimerSingletonDef { 
... 

Вам необходимо написать/сгенерировать EJB @Local или @Remote интерфейс.

...  
@Remote 
public interface MyTimerSingletonDef { 
... 

Java EE-реализация поставщиков mappedNames поддержки может отличаться, как правило, JNDI имя модуля EJB-то вроде этого: Java: модуль/EJB-mappedName-недвижимость!каноническое-EJB-интерфейс имя- или Java: модуль/EJB-mappedName-свойство # канонического-EJB-интерфейс имя-, так что вы получите что-то вроде этого:

java:module/MyTimerSingleton!example.package.MyTimerSingletonDef 

или это

java:module/MyTimerSingleton#example.package.MyTimerSingletonDef 

в соответствии с this blog и JBoss documentation в случае JBoss и WildFly

Поскольку Java EE 6 с именем JNDI синтаксиса в качестве EJB компонент имеет следующую структуру:

[/<application-name>]/<module-name>/<bean-name>[!<full-qualified-interface-name>] 

По умолчанию имя приложения является имя файла предприятия архива. Поэтому рекомендуется настроить имя приложения в дескрипторе развертывания application.xml предприятия , как показано ниже.

<application xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/application_7.xsd" 
     version="7"> 
    <application-name>myapp</application-name> 
    ... 
</application> 

Также рекомендуется настроить имя модуля модуля EJB. В противном случае именем модуля по умолчанию является имя файла архива ejb . Имя модуля можно настроить с помощью дескриптора развертывания ejb-jar.xml .

<ejb-jar xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd" 
    version="3.2"> 
    <module-name>remote</module-name> 
</ejb-jar> 

EJB-компонент компонент будет зарегистрирован, в соответствии со спецификацией, в пределах Java пространств имен: глобальный, Java: приложение и Java: модуль.

Таким образом, вы получите что-то вроде этого в консоли сервера:

java:global/myapp/remote/MyTimerSingleton!example.package.MyTimerSingletonDef 
java:app/myapp/remote/MyTimerSingleton!example.package.MyTimerSingletonDef 
java:module/myapp/MyTimerSingleton!example.package.MyTimerSingletonDef 

Таким образом, решение может быть настройки приложения (в application.xml) и EJB-модуль (EJB-банку .xml), чтобы всегда получать одно и то же портативное имя JNDI.

+0

На самом деле, я забыл сказать, что я вызываю поиск из org.jboss.msc.service.Service, поэтому я не могу сделать @EJB для ввода класса (он вводит null). Я пробовал другие решения, но я получаю одно и то же имяNotFoundException (с удаленным и локальным). Никакие новые записи не добавляются в раздел «Имена иконок консоли jBoss». – XaviGG

+1

Вы пытались использовать java-ee (ejb-jar.xml) или дескрипторы развертывания jboss (jboss.xml) ??? –

+0

Я создал файл ejb-jar.xml, но ничего не изменилось. Я обнаружил проблему при использовании вашего второго решения в вашем ответе. В настоящий момент я делаю класс MyTimerSingleton реализованным интерфейсом Local и Remote, список JNDI-имен консоли jBoss пуст в моем модуле. Если я не помещаю оператор реализации, он содержит имена, как описано в вопросе. Я собираюсь добавить дополнительную информацию в вопрос, чтобы уточнить его. – XaviGG