[英]Wildfly Remote EJB Invocation
我试图调用部署在远程服务器上的无状态EJB。 我可以从本地JBoss环境调用Bean,但是当将remote.connection.default.host
更改为远程计算机的主机时,我的客户端代码不起作用。
这是我的jboss-ejb-client.properties
:
endpoint.name=client-endpoint
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=SERVERIP/HOSTNAME
remote.connection.default.port=8080
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connection.default.username=username
remote.connection.default.password=Password
我的客户代码如下所示:
Properties properties = new Properties();
properties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
String jndi = "jndi_name";
Context context = new InitialContext(properties);
obj = context.lookup(jndi);
请帮忙。
谢谢大家 插口。
这个答案可能很晚,但是我遇到了同样的问题,以上答案都没有帮助我解决此问题,请参考以下内容: http : //blog.jonasbandi.net/2013/08/jboss-remote-ejb-invocation -unexpected.html
适用于我的代码如下:
Properties jndiProperties=new Properties();
jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
jndiProperties.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:8080/");
//This property is important for remote resolving
jndiProperties.put("jboss.naming.client.ejb.context", true);
//This propert is not important for remote resolving
jndiProperties.put("org.jboss.ejb.client.scoped.context", "true");
Context context=new InitialContext(jndiProperties);
/*
java:global/JEETest_Project/EJBTest_Project/GenericStateless!test.stateless.GenericStateless
java:app/EJBTest_Project/GenericStateless!test.stateless.GenericStateless
java:module/GenericStateless!test.stateless.GenericStateless
java:jboss/exported/JEETest_Project/EJBTest_Project/GenericStateless!test.stateless.GenericStateless
java:global/JEETest_Project/EJBTest_Project/GenericStateless
java:app/EJBTest_Project/GenericStateless
java:module/GenericStateless
*/
//None of the above names work for remote EJb resolution ONLY THIS WORKS -
//"/JEETest_Project/EJBTest_Project/GenericStateless!test.stateless.GenericStateless"
GenericStateless bean=(GenericStateless)context.lookup("/JEETest_Project/EJBTest_Project/GenericStateless!test.stateless.GenericStateless");
//GenericStateless bean=(GenericStateless)c.lookup("GenericStateless!test.stateless.GenericStateless");
System.out.println(bean.getInt());
我的客户在一个独立的Maven项目中。 我要做的就是添加此依赖项:
<dependency>
<groupId>org.wildfly</groupId>
<artifactId>wildfly-ejb-client-bom</artifactId>
<version>10.1.0.Final</version>
<type>pom</type>
<scope>runtime</scope>
</dependency>
我通过查看ejb-remote示例来解决此问题。
您的客户代码必须使用EJB 3标准化JNDI名称来访问您的bean。
Properties properties = new Properties();
properties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
// Not needed but I like to see it when debugging
properties.put(Context.PROVIDER_URL, "http-remoting://localhost:8080/");
// EJB 3 bean naming convention
String jndi = "ejb:/myapp/mymodule/myEjbName!my.own.package.EjbInterface";
Context context = new InitialContext(properties);
obj = context.lookup(jndi);
并检查WildFly server.log以获取您的bean的已导出JNDI绑定: java:jboss/exported/myapp/mymodule/myEjbName!my.own.package.EjbInterface
要通过安全检查,必须在ApplicationRealm
定义用户名。
通常,在Java EE中,让容器执行查找,而不是自己执行。 从Java EE 6教程中 :
要通过依赖注入获得对企业bean的远程业务接口的引用,请使用javax.ejb.EJB批注并指定企业bean的远程业务接口名称:
@EJB Example example;
如果必须是JNDI查找,请查看此JBoss教程 -尽管它适用于版本7,但也许对您的情况有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.