Ya hemos hablado en otros post sobre EJBs remotos y locales recalcando que los ejbs locales se acceden desde la misma maquina virtual y los remotos desde otra maquina virtual.
Es cierto que esta situación se produce habitualmente .Sin embargo no es la situación mas típica con la que nos podamos encontrar a nivel de uso de EJBs .Quizas la situación mas habitual es la de tener dos aplicaciones (EARs) y que desde la aplicación A haya que acceder a un EJB de la aplicación B.
Ahora bien este acceso se produce desde la misma maquina virtual pero en distintos EARs . ¿Se trata de un acceso local o de un acceso remoto?. La respuesta no es evidente .En principio se trataría de un acceso local ya que nos encontramos en la misma maquina virtual .
EJB Remove vs Local
Lamentablemente esto no tiene porque ser así siempre ya que la especificación unicamente obliga a que el interface de acceso local este disponible para los clientes que se encuentran ubicados en el mismo EAR . No especifica el acceso desde otros EARs . Por lo tanto la respuesta dependerá de cada servidor de aplicaciones. Si queremos asegurarnos de que el acceso funciona en cualquier servidor de aplicaciones deberemos construir un EJB con acceso remoto.
package com.arquitecturajava.ejb; import javax.ejb.Remote; @Remote public interface HolaEJBRemote { public String mensaje(); }
package com.arquitecturajava.ejb; import javax.ejb.Stateless; @Stateless public class HolaEJB implements HolaEJBRemote { public HolaEJB() { // TODO Auto-generated constructor stub } @Override public String mensaje() { // TODO Auto-generated method stub return "hola peticion remota a un ejb"; } }
Creado el EJB remoto podremos acceder a el de una forma sencilla a traves de por ejemplo un servlet y utilizando la anotación de @EJB .Eso si deberemos apoyarnos en los conocimientos adquiridos en el post anterior de “Portable JNDI” y utilizar la anotación @EJB con el atributo de lookup. Vamos a ver un servlet que accede al EJB.
package com.arquitecturajava; 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.arquitecturajava.ejb.HolaEJBRemote; @WebServlet("/ServletAccesoRemoto") public class ServletAccesoRemoto extends HttpServlet { private static final long serialVersionUID = 1L; @EJB(lookup="java:global/EARHolaMundoRemoto/EJBRemote/HolaEJB") HolaEJBRemote miejb; public ServletAccesoRemoto() { super(); // TODO Auto-generated constructor stub } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter pw= response.getWriter(); pw.println(miejb.mensaje()); pw.close(); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
Podemos ver como la anotación referencia al EJB que queremos acceder .
@EJB(lookup="java:global/EARHolaMundoRemoto/EJBRemote/HolaEJB") HolaEJBRemote miejb;
Solo nos queda invocar el servlet y ver el resultado .
Cecilio buen día, me parece muy interesante lo descrito en tu POST y quisiera consultarte lo siguiente. Cuento con un EJB que tiene dos componentes, el primero es una aplicación JAVA, tipo cliente servidor que me retorna una información y en el mismo EJB un WebService, ahora bien necesito que la parte del WebService haga que la parte cliente servidor se ejecute. Cómo podría lograr esta interacción? Lamentablemente la compatibilidad de librería y funciones de la parte Cliente/Servidor no se pueden ejecutar desde el WebService, porque de esta manera sería más directo el proceso, y es por esto que surge… Read more »
Usando websockets o server side events si te he entendido bien 🙂
Cecilio.
Desde que encontré tu página me pareció tan pero tan útil, que tuve que obligadamente colocar una tarea en https://www.habitica.com/ a nivel diario.
Te agradezco los post que has colocado de EJB que ya tenia practicamente olvidados y vuelvo agradecer los gráficos y la forma tan clara de explicar los conceptos.
Con tus conocimientos, podrías pensar en publicar en UDEMY algun curso, hay muy pocos en español
Saludos, gracias.
Me apunto la idea , muchas gracias por tus comentarios 🙂
Hola,
Quería consultarte una duda, vengo de EJB 3.0, y en esta especificación teníamos la interfazr remota(@Remote) y la Local(@Local).
Estaba bastante claro cuando usar la local, que era para accesos en la misma JVM.
Ahora con la especificación 3.1 aparece el concepto de @LocalBean que no implementa ninguna interface y también es para accesos locales.
La pregunta es : ¿Cómo se queda la utilidad de la interfaz @Local, que utilidad sigue teniendo usar ésta en contra del @LocalBean?
Gracias por el aporte
Si lo necesitas enlazar a varios Wars puedes poner los interfaces en un jar aparte y es más flexible
Saludos, la interfaz jar cliente puede ser usada en Android?
No se me ha ocurrido probarlo ,no parece la mejor opción de entrada. Sería mucho más natural publicar el EJB como Servicio REST e invocarlo desde android con las apis que su plataforma soporta 🙂
Saludos desde Colombia, Primero que todo quisiera decirle que me parece muy interesante su sitio web, contiene posts con ejemplos y explicaciones muy útiles. Respecto del tema específico de este post (remote EJBs), siempre me ha surgido una duda: se supone que los EJB al final son servicios de negocio que expone un sistema (parecido al concepto de los servicios web, aunque obviamente con muchas mas bondades); aunque nunca he tenido este caso en mi trabajo, si quisiera consumir o acceder a un EJB remoto de una aplicacion externa a parte de conocer la identificacion JNDI se debe conocer y… Read more »
Lo logico es definir esa interface en un jar que compartan cliente y servidor y cada uno tenga su copia 🙂
No exponen metadata ya que si lo hicieran estarían ligados a una plataforma concreta y son genericos
El hecho que para la “instanciación” de dichos servicios se utilice un jar con las interfaces definidas, no los haría java-dependientes?
Los haría dependientes de la interface.. pero claro siempre lo son el servidor lo implementa a través del proxy remoto y el cliente lo implementa a través del proxy local.
Gracias por el aporte, pero probando algo parecido, me da un error, y no se como solucionarlo. En concreto …. “2015-04-01T00:00:33.487+0200|Grave: Class [ Lcom/master/sesion/EjbExternoRemote; ] not found. Error while loading [ class com.master.servlet.LLamaEjb ]” Al tratar de desplegarlo en Glassfish 4 Previamente, he desplegado el EAR, y todo ha ido correcto, incluso en la consola obtengo el mensaje, al desplegar ” Portable JNDI names for EJB EjbExterno: ” Pues he declarado un interfaz local y otro remoto. El código del servlet, muy simple ….. import com.master.sesion.EjbExternoRemote; @WebServlet(“/LLamaEjb”) public class LLamaEjb extends HttpServlet { private static final long serialVersionUID = 1L;… Read more »
Intenta hacer un ejemplo mas sencillo en el cual el EAR contenga el Servlet también en un war. Eso debería funcionar sin problemas y luego revisa la doc de glassfish por si hubiera alguna peculiaridad
Buenas tardes Cecilio.
He repasado todos los post relacionados con la tecnología EJB y me han parecido bastante interesantes. Actualmente estoy interesado en prepararme para obtener la certificación Oracle Certified Expert, Java Platform, Enterprise Edition 6 Enterprise JavaBeans Developer y la verdad agradecería mucho si conoces algunas fuentes o herramientas de estudio que me permitan alcanzar este objetivo, me refiero específicamente a libros o sitios web confiables para abordar los temas que se evalúan. Muchas gracias y estamos en contacto.
Lamentablemente no existen libros especificos para prepararla. Lo mas cercano que existe es EJB in Action de Manning press 🙂