从其他服务器远程访问EJB

时间:2013-08-13 21:34:18

标签: java-ee servlets ejb glassfish-3 ejb-3.1

我正在Eclipse Juno中开发一个包含 EJB 3.1 动态Web项目的项目。

EJB类称为 FirstBean ,Servlet称为 EJB31ServletClient ,我只能使其在相同的服务器中工作。我已经读过我需要设置InitialContext.lookup,但几乎所有示例都是针对JavaSE应用程序的。

我想要实现的目标:

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

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

  3. 这是我的代码:

    EJB是一个非常简单的无状态会话Bean ,带有无界面视图,只显示一条消息:

    import javax.ejb.LocalBean;
    import javax.ejb.Stateless;
    
    @Stateless
    @LocalBean
    public class FirstBean {
        public FirstBean() {
        }
    
        public String sayHello() {
            return "Hello";
        }
    }
    

    Dynamic Web Project只有一个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());
        }
    }
    

1 个答案:

答案 0 :(得分:4)

您需要使用远程接口创建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";
    }
}

您需要使用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");

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