从其他服务器远程访问EJB

Jes*_*sai 6 servlets ejb java-ee ejb-3.1 glassfish-3

我正在Eclipse Juno中开发一个包含EJB 3.1Dynamic Web Project的项目

EJB类称为FirstBean,而Servlet被称为EJB31ServletClient,我只是实现了使其在同一服务器上工作。我读到我需要设置InitialContext.lookup,但是几乎所有示例都是针对JavaSE应用程序的。

我要实现的目标:

  1. 在Glassfish 3.1.2.2服务器中部署EJB Jar,并在其他GlassFish服务器中部署动态Web项目。

  2. 在EJB31ServletClient中调用sayHello()方法。

这是我的代码:

EJB是一个非常简单的无状态会话Bean,具有无接口视图,仅显示一条消息:

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

@Stateless
@LocalBean
public class FirstBean {
    public FirstBean() {
    }

    public String sayHello() {
        return "Hello";
    }
}
Run Code Online (Sandbox Code Playgroud)

动态Web项目只有一个带有以下代码的Servlet:

import java.io.IOException;
import java.io.PrintWriter;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.theopentutorials.businesslogic.FirstBean;

@WebServlet("/EJB31ServletClient")
public class EJB31ServletClient extends HttpServlet {

    private static final long serialVersionUID = 1L;
    @EJB
    FirstBean bean;

    public EJB31ServletClient() {
        super();
    }

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println(bean.sayHello());
    }
}
Run Code Online (Sandbox Code Playgroud)

Mei*_*ppa 5

您需要使用远程接口创建bean。您创建的bean是Local,No-Interface bean,可以使用相同的JVM进行访问。要对bean进行远程调用,您需要创建一个带有远程接口的bean。参见下面修改后的bean代码和接口。

public class FirstBeanRemote{
    public String sayHello() ;
}

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

@Stateless
@LocalBean
@Remote(FirstBeanRemote.class)
public class FirstBean {
    public FirstBean() {
    }

    public String sayHello() {
        return "Hello";
    }
}
Run Code Online (Sandbox Code Playgroud)

并且您需要使用JNDI查找从其他服务器查找EJB。

Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("org.omg.CORBA.ORBInitialHost", "*hostname*");
props.setProperty("org.omg.CORBA.ORBInitialPort", "*3700*");//default port
InitialContext ctx = new InitialContext(props);
FirstBeanRemote bean = (FirstBeanRemote) ctx.lookup("java:global/*EARNAME/EJBJARNAME*/FirstBean!*fullyqualifiedpackage*.FirstBeanRemote");
Run Code Online (Sandbox Code Playgroud)

试试这个,检查是否有效。如果找不到远程bean的JNDI名称,则只需抓取glassfish管理控制台即可找到它

  • 不,属性会有所不同,如果我没记错的话,以下是属性。props.putContext.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"); props.put(Context.PROVIDER_URL, "corbaloc:iiop:localhost:2809"); (2认同)
  • 短语:**您创建的 bean 是一个本地、无接口 bean,可以使用相同的 JVM 访问**是不正确的。本地/无接口 bean 只能在同一应用程序(.war 或 .ear)内访问。同一 JVM 内的其他应用程序无法访问它。为此,您仍然需要一个远程接口。 (2认同)