Я хотел бы знать, как искать EJB, расположенный на сервере WildFly, с удаленного клиента с использованием JNDI.
Вот что я использую для инициализации контекста
jndiProps.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
jndiProps.put(Context.PROVIDER_URL, "http-remoting://192.168.0.15:8080");
jndiProps.put("jboss.naming.client.ejb.context", true);
Context ctx = new InitialContext(jndiProps);
И это консольный вывод при развертывании сервера:
21:08:29,352 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-10) JNDI bindings for session bean named DataBaseServiceImpl in deployment unit deployment "AnalyseExcelServeur.war" are as follows:
java:global/AnalyseExcelServeur/DataBaseServiceImpl!serveur.database.DataBaseService
java:app/AnalyseExcelServeur/DataBaseServiceImpl!serveur.database.DataBaseService
java:module/DataBaseServiceImpl!serveur.database.DataBaseService
java:jboss/exported/AnalyseExcelServeur/DataBaseServiceImpl!serveur.database.DataBaseService
java:global/AnalyseExcelServeur/DataBaseServiceImpl
java:app/AnalyseExcelServeur/DataBaseServiceImpl
java:module/DataBaseServiceImpl
Я попробовал много комбинации, но каждый раз, когда я получаю javax.naming.NameNotFoundException:
javax.naming.NameNotFoundException: exported/AnalyseExcelServeur/DataBaseServiceImpl!serveur.database.DataBaseService -- service jboss.naming.context.java.jboss.exported.exported.AnalyseExcelServeur."DataBaseServiceImpl!serveur.database.DataBaseService"
at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:104)
at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:202)
at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:179)
at org.jboss.naming.remote.protocol.v1.Protocol$1.handleServerMessage(Protocol.java:127)
at org.jboss.naming.remote.protocol.v1.RemoteNamingServerV1$MessageReciever$1.run(RemoteNamingServerV1.java:73)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Я не определил имя приложения или имя модуля.
Вот как я объявляю EJB:
@Stateless
@Remote(DataBaseService.class)
public class DataBaseServiceImpl extends SessionDB implements DataBaseService
На стороне клиента реализация интерфейса DataBaseService находится в пакете compte.remote.ejb
Я не знаю, нужно ли мне использовать ejb: /appname/modulename/bean/location или просто /appname/modulename/bean/location или что-нибудь еще...
Может быть, я должен поместить файл в.war, чтобы объявить EJB...
Я сделал это !! Проблема заключалась в том, что я использовал два разных класса для ejb.
EJB на стороне сервера был в serveur.database.DataBaseService
Интерфейс ejb на стороне клиента был в compte.remote.ejb.DataBaseService
Они должны быть в одном пути, поэтому я перемещаю ejb на стороне клиента в имя пакета serveur.database и это работает!
Возможно, вам стоит взглянуть на документацию:
https://docs.jboss.org/author/display/WFLY8/EJB+invocations+from+a+remote+client+using+JNDI
jndiProperties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming")
я поместил jboss-ejb-client.properties в ресурсы src / main / (может быть, не должно быть здесь?). Вот почему я использовал jndiProps.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
Которые работают, кстати (у меня есть "Рукопожатие" и серверная сторона реагируют), но URL-адрес ejb не так ...
Надеюсь, это поможет разобраться. (Это для поиска очереди JMS, но так же, как вы можете это сделать и для Beans).
http://www.mastertheboss.com/jboss-server/jboss-jms/how-to-code-a-remote-jms-client-for-wildfly-8
благодаря