如何将 EJB 查找到客户端的 WildFly 服务器
How to lookup EJB into WildFly server to a client
我想知道如何使用 JNDI 从远程客户端查找位于 WildFly 服务器中的 EJB。
这是我用来初始化上下文的
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.handleServerMessage(Protocol.java:127)
at org.jboss.naming.remote.protocol.v1.RemoteNamingServerV1$MessageReciever.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)
我没有定义应用名称或模块名称。
- 服务器的项目名称是:AnalyseExcelServeur
- EJB 的名称是 DataBaseServiceImpl
- EJB 实现位于包 serveur.database
中的 DataBaseService
这是我声明 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...
也许你应该看看文档:
https://docs.jboss.org/author/display/WFLY8/EJB+invocations+from+a+remote+client+using+JNDI
希望这可能有助于解决问题。 (它用于查找 JMS 队列,但您也可以用同样的方式查找 Beans。)
http://www.mastertheboss.com/jboss-server/jboss-jms/how-to-code-a-remote-jms-client-for-wildfly-8
谢谢
我做到了!!问题是我为 ejb 使用了两个不同的类路径。
服务器端的 ejb 在 serveur.database.DataBaseService
客户端的ejb接口在compte.remote.ejb.DataBaseService
它们应该在同一条路径上,所以我将客户端的 ejb 重新定位到一个包名 serveur.database 并且成功了!
我想知道如何使用 JNDI 从远程客户端查找位于 WildFly 服务器中的 EJB。
这是我用来初始化上下文的
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.handleServerMessage(Protocol.java:127)
at org.jboss.naming.remote.protocol.v1.RemoteNamingServerV1$MessageReciever.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)
我没有定义应用名称或模块名称。
- 服务器的项目名称是:AnalyseExcelServeur
- EJB 的名称是 DataBaseServiceImpl
- EJB 实现位于包 serveur.database 中的 DataBaseService
这是我声明 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...
也许你应该看看文档:
https://docs.jboss.org/author/display/WFLY8/EJB+invocations+from+a+remote+client+using+JNDI
希望这可能有助于解决问题。 (它用于查找 JMS 队列,但您也可以用同样的方式查找 Beans。)
http://www.mastertheboss.com/jboss-server/jboss-jms/how-to-code-a-remote-jms-client-for-wildfly-8
谢谢
我做到了!!问题是我为 ejb 使用了两个不同的类路径。
服务器端的 ejb 在 serveur.database.DataBaseService
客户端的ejb接口在compte.remote.ejb.DataBaseService
它们应该在同一条路径上,所以我将客户端的 ejb 重新定位到一个包名 serveur.database 并且成功了!