用于访问部署在 JBOSS AS 中的 EJB 的远程客户端的 JNDI 循环(7.1.1 最终版本)
JNDI loopup for a remote client accessing an EJB deployed in JBOSS AS (7.1.1 final)
我创建了一个简单的 EJB 3.0 应用程序,部署在 JBOSS 7.1.1 final 中。
代码如下:
EJB 1:
界面
package com.example.server.local.bean;
import javax.ejb.Local;
@Local
public interface UtilLocalBeanLocal {
public String addString();
}
Class 实现这个接口:
package com.example.server.local.bean;
import javax.ejb.Local;
import javax.ejb.Stateless;
@Stateless
@Local(value=UtilLocalBeanLocal.class)
public class UtilLocalBean implements UtilLocalBeanLocal {
public UtilLocalBean() {
}
@Override
public String addString() {
return "Added from Local bean";
}
}
因此,我创建的这个 EJB "locally" 由另一个 EJB 使用。
EJB 2:
界面
package com.example.bean.session;
import javax.ejb.Remote;
@Remote
public interface FirstBeanRemote {
public String callMe();
}
Class 实现此接口。
package com.example.bean.session;
import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import com.example.server.local.bean.UtilLocalBeanLocal;
@Stateless
@Remote(value=FirstBeanRemote.class)
public class FirstBean implements FirstBeanRemote {
@EJB
private UtilLocalBeanLocal utilLocalBeanLocal;
public FirstBean() {
}
@Override
public String callMe() {
return "Hi there!" + utilLocalBeanLocal.addString();
}
}
当我启动 JBOSS 时,我得到的 JNDI 绑定是这样的:
00:34:15,928 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-5) JNDI bindings for session bean named FirstBean in deployment unit subdeployment "EJB30TestProj.jar" of deployment "EJB30TestProjEAR.ear" are as follows:
java:global/EJB30TestProjEAR/EJB30TestProj/FirstBean!com.example.bean.session.FirstBeanRemote
java:app/EJB30TestProj/FirstBean!com.example.bean.session.FirstBeanRemote
java:module/FirstBean!com.example.bean.session.FirstBeanRemote
java:jboss/exported/EJB30TestProjEAR/EJB30TestProj/FirstBean!com.example.bean.session.FirstBeanRemote
java:global/EJB30TestProjEAR/EJB30TestProj/FirstBean
java:app/EJB30TestProj/FirstBean
java:module/FirstBean
但是在远程客户端中,当我尝试使用上述 JNDI 绑定值中的任何一个时,它不起作用,而实际起作用的(在大量 google 之后)是:
ejb:EJB30TestProjEAR/EJB30TestProj//FirstBean!com.example.bean.session.FirstBeanRemote
很难理解此 JNDI 绑定的工作原理。 JBOSS 输出一个不同的 JNDI,实际上是不同的 JNDI。
任何人都可以揭开这个神秘面纱吗? (如何确定哪些 JNDI 绑定将在不同的场景和任何进一步的指针中工作)
您提到的绑定值已准备好在本地查找,假设在您发布 ejb 的服务器中。 global、module、app 是范围限制,您可以在其中使用每一个。例如,您可以使用 module 范围从同一 ejb 模块的其他 ejb 中查找 ejb,但您无法从另一个 ejb 模块中查找它,即使是同一应用程序的模块( ear 或 war),你必须至少使用 app 范围,你可以使用 app 或 global 在两种情况下。
我强烈建议您花时间阅读 Jboss AS7 JNDI Referencia,但要了解远程查找请转到 远程 JNDI 部分
我创建了一个简单的 EJB 3.0 应用程序,部署在 JBOSS 7.1.1 final 中。
代码如下:
EJB 1:
界面
package com.example.server.local.bean;
import javax.ejb.Local;
@Local
public interface UtilLocalBeanLocal {
public String addString();
}
Class 实现这个接口:
package com.example.server.local.bean;
import javax.ejb.Local;
import javax.ejb.Stateless;
@Stateless
@Local(value=UtilLocalBeanLocal.class)
public class UtilLocalBean implements UtilLocalBeanLocal {
public UtilLocalBean() {
}
@Override
public String addString() {
return "Added from Local bean";
}
}
因此,我创建的这个 EJB "locally" 由另一个 EJB 使用。
EJB 2:
界面
package com.example.bean.session;
import javax.ejb.Remote;
@Remote
public interface FirstBeanRemote {
public String callMe();
}
Class 实现此接口。
package com.example.bean.session;
import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import com.example.server.local.bean.UtilLocalBeanLocal;
@Stateless
@Remote(value=FirstBeanRemote.class)
public class FirstBean implements FirstBeanRemote {
@EJB
private UtilLocalBeanLocal utilLocalBeanLocal;
public FirstBean() {
}
@Override
public String callMe() {
return "Hi there!" + utilLocalBeanLocal.addString();
}
}
当我启动 JBOSS 时,我得到的 JNDI 绑定是这样的:
00:34:15,928 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-5) JNDI bindings for session bean named FirstBean in deployment unit subdeployment "EJB30TestProj.jar" of deployment "EJB30TestProjEAR.ear" are as follows:
java:global/EJB30TestProjEAR/EJB30TestProj/FirstBean!com.example.bean.session.FirstBeanRemote
java:app/EJB30TestProj/FirstBean!com.example.bean.session.FirstBeanRemote
java:module/FirstBean!com.example.bean.session.FirstBeanRemote
java:jboss/exported/EJB30TestProjEAR/EJB30TestProj/FirstBean!com.example.bean.session.FirstBeanRemote
java:global/EJB30TestProjEAR/EJB30TestProj/FirstBean
java:app/EJB30TestProj/FirstBean
java:module/FirstBean
但是在远程客户端中,当我尝试使用上述 JNDI 绑定值中的任何一个时,它不起作用,而实际起作用的(在大量 google 之后)是:
ejb:EJB30TestProjEAR/EJB30TestProj//FirstBean!com.example.bean.session.FirstBeanRemote
很难理解此 JNDI 绑定的工作原理。 JBOSS 输出一个不同的 JNDI,实际上是不同的 JNDI。
任何人都可以揭开这个神秘面纱吗? (如何确定哪些 JNDI 绑定将在不同的场景和任何进一步的指针中工作)
您提到的绑定值已准备好在本地查找,假设在您发布 ejb 的服务器中。 global、module、app 是范围限制,您可以在其中使用每一个。例如,您可以使用 module 范围从同一 ejb 模块的其他 ejb 中查找 ejb,但您无法从另一个 ejb 模块中查找它,即使是同一应用程序的模块( ear 或 war),你必须至少使用 app 范围,你可以使用 app 或 global 在两种情况下。
我强烈建议您花时间阅读 Jboss AS7 JNDI Referencia,但要了解远程查找请转到 远程 JNDI 部分