远程客户端访问部署在 JBOSS AS 中的 EJB 的 JNDI 循环(7.1.1 最终版)

Posted

技术标签:

【中文标题】远程客户端访问部署在 JBOSS AS 中的 EJB 的 JNDI 循环(7.1.1 最终版)【英文标题】:JNDI loopup for a remote client accessing an EJB deployed in JBOSS AS (7.1.1 final) 【发布时间】:2015-08-06 06:46:57 【问题描述】:

我创建了一个简单的 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();

实现此接口的类:

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 被另一个 EJB “本地”使用。

EJB 2:

界面

package com.example.bean.session;

import javax.ejb.Remote;

@Remote
public interface FirstBeanRemote 

    public String callMe();

实现此接口的类。

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 绑定将在不同的场景中工作以及任何进一步的指针)

【问题讨论】:

【参考方案1】:

您提到的绑定值已准备好在本地查找,假设您发布 ejb 到服务器中。 global、module、app 是范围限制,您可以在其中使用每一个。例如,您可以使用 module 范围从同一 ejb 模块的其他 ejb 中查找 ejb,但即使是同一应用程序(ear 或 war)的模块,您也无法从另一个 ejb 模块中查找它),您必须至少使用 app 范围,并且您可以在这两种情况下使用 appglobal

我强烈建议您花时间阅读Jboss AS7 JNDI Referencia,但要了解远程查找,请转到远程 JNDI 部分

【讨论】:

以上是关于远程客户端访问部署在 JBOSS AS 中的 EJB 的 JNDI 循环(7.1.1 最终版)的主要内容,如果未能解决你的问题,请参考以下文章

jboss-as-maven-plugin 无法部署到远程 JBoss AS7?

从另一个客户端访问部署在 JBoss 7.0.1 中的 ejb

EJB远程客户端从JBoss AS 7.1迁移到Wildfly 8.1

EJB 远程客户端从 JBoss AS 7.1 迁移到 Wildfly 8.1

无法访问部署在远程JBoss上的Web应用程序

JBoss AS7中进行项目部署