2013-08-13 3 views
4

Я развивающихся в Eclipse, Juno проект, который включает в себя EJB 3.1 и Dynamic Web Project.Доступ к EJB удаленно с другого сервера

EJB-класс называется FirstBean и Servlet называется EJB31ServletClient, я достиг только чтобы заставить его работать в одном сервере. Я прочитал, что мне нужно настроить InitialContext.lookup, но почти все примеры сделаны для приложений JavaSE.

То, что я хочу добиться:

  1. Развертывание EJB Jar в сервере Glassfish 3.1.2.2 и развертывания динамических веб-проект в другом GlassFish сервере.

  2. Вызовите в EJB31ServletClient метод sayHello().

Вот мой код:

EJB-очень простой Stateless Session Bean с No-интерфейс Просмотр что только показывает сообщение:

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

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

    public String sayHello() { 
     return "Hello"; 
    } 
} 

Dynamic Web Project имеет только сервлет со следующим кодом:

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()); 
    } 
} 
+0

Я не знаю Glassfish и не могу ответить на вопрос, но локальный компонент по определению является локальным , и, следовательно, невозможно получить доступ удаленно. –

ответ

4

Вам необходимо создать свой bean-компонент с удаленным интерфейсом. Компонент, который вы создали, представляет собой локальный, без интерфейса компонент, к которому можно получить доступ с помощью той же JVM. Чтобы сделать удаленные вызовы для вашего компонента, вам нужно создать компонент с удаленным интерфейсом. См. Ниже модифицированный код и интерфейс.

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"; 
    } 
} 

И вам нужно найти свой EJB с другого сервера с помощью поиска JNDI.

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"); 

Попробуйте это и проверьте, не работает ли оно. Если вы не смогли найти имя JNDI для удаленного компонента, просто сканируйте свою консоль администратора Glassfish, чтобы его можно было найти

+1

Отлично, я знаю, что из основного вопроса, но если я хочу развернуть свой проект в Websphere Application Server, будут ли свойства одинаковыми? – Jessai

+1

Нет свойств, которые будут отличаться, если я правильно следую за ними. props.putContext.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"); props.put (Context.PROVIDER_URL, "corbaloc: iiop: localhost: 2809"); –

+1

Фраза: ** Боб, который вы создали, является локальным, без интерфейса, который может быть доступен с помощью одного JVM **, неверен. Локальный/Нет-интерфейс может быть доступен только внутри одного приложения (.war или .ear). К тому же JVM не может получить доступ к другому приложению. Для этого вам все равно нужен интерфейс Remote. –

Смежные вопросы