Una de las razones mas habituales para utilizar EJBs es poder acceder remotamente a ellos desde otras aplicaciones que se ejecutan en maquinas virtuales diferentes. En esta entrada vamos a desarrollar un EJB remoto al cual accedamos desde otra maquina virtual que cargue una sencilla aplicación de consola.
El primer paso que realizaremos será implementar un EJB con un interface remoto al cual podamos invocar desde un cliente.
Como podemos ver en la imagen el EJB se denomina HolaEJB y su interface HolaEJBRemote. Vamos a mostrar el código fuente de ambos.
Interface
import javax.ejb.Remote; @Remote public interface HolaEJBRemote { public String mensaje(); }
Implementación
import javax.ejb.Stateless; @Stateless public class HolaEJB implements HolaEJBRemote { public HolaEJB() { } @Override public String mensaje() { return "hola peticion remota a un ejb"; } } <pre>
Una vez tenemos claro el interface e implementación del EJB . Lo desplegamos dentro de un EAR en nuestro servidor de aplicaciones JBoss.
Desplegado el EAR veremos en los logs de JBoss como ha quedado registrado . A partir de ese momento pasaremos a construir un cliente .Una peculiaridad que tienen los clientes remotos es que cada servidor de aplicaciones se configura de una forma distinta.Vamos a ver que elementos tiene que tener nuestro proyecto cliente.
Como podemos ver nuestro proyecto es un proyecto sencillo de consola que añade dos cosas .
- jboss-ejb-client.properties : Fichero de propiedades que configura la conexión al Servidor
- jboss-client.jar: Fichero JAR que incluye las librerías necesarias para conectarnos remotamente a jboss. Este fichero esta en la carpeta /jboss/client/bin .
endpoint.name=cliente remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false remote.connections=default remote.connection.default.host=localhost remote.connection.default.port = 4447
import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import com.arquitecturajava.ejb.HolaEJBRemote; public class Principal { public static void main(String[] args) { try { Hashtable propiedades = new Hashtable(); propiedades .put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); Context context = new InitialContext(propiedades); HolaEJBRemote miejb=(HolaEJBRemote) context.lookup("ejb:EARHolaMundoRemoto/EJBRemote//HolaEJB!com.arquitecturajava.ejb.HolaEJBRemote"); System.out.println(miejb.mensaje()); } catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
En el código se muestra como usamos JNDI para acceder al recurso remoto.Ejecutamos nuestro código y podremos ver el mensaje por consola.
Hemos conseguido conectarnos a un EJB de forma remota
[…] Otros artículos relacionados: Java EE EJB , EJB remoto […]
[…] Otros artículos relacionados: Introducción EJB , EJBs Remotos […]
Buenas tardes. Hay una cosa que no me queda muy clara, aunque el EJB sea remoto el cliente tiene que conocer su interfaz lo cual obliga a tener la librería en el cliente, entonces para que necesito el EJB remoto si al final voy a tener la librería almacenada localmente?? Un saludo!
Lo que tendrás no es la libreria del EJB remoto sino unicamente las clases del interface y la libreria remota de tu servidor de aplicaciones que gestione el acceso JNDI 🙂
Necesito de la ayuda de alguno, tengo una app con EJB ejecutándose en jboss7, cuando cambio el war desde la administracion de jboss empieza a darme Component is stopped, si reinicio todo el servidor no hay problema y he googleado y aun no encuentro una solución clara. Le resumo tengo un Service que es Singleton que implementa una interfaz que no so propietario, la cual solo contiene un metodo llamado actionPerformed, la cual la finalidad es poder recibir mensajes desde otro servidor y procesar esa informacion y responderle en algunos casos, básicamente eso es todo. El error siempre que cambio… Read more »
[…] artículos relacionados: Introducción a EJB , EJB Remotos , EJB […]
[…] artículos relacionados: Introducción a EJB , EJB Remotos , el concepto de […]
Hola Cecilio, entendi bien tu ejemplo pero no veo en que momento del codigo de asignas el fichero de propiedades a la variable propiedades tipo Hastable, supongo q en algun momento se deberia hacer para q el la app sepa en que ip y en que puerto ir a buscar el ejb.
Saludos.
si date cuenta que pone localhost 🙂 en el ejemplo del fichero de properties
jboss-ejb-client.properties es el archivo de propiedades que no encuentro, muchas gracias por su colaboracion.
saludos, alguien porfavor me podria decir en que ruta del servidor JBOSS 7.1.1 FINAL” se encuentra ubicado el archivo de propiedades ? en caso de tener que crearlo, se configura dicha lectura del archivo de propiedades en el standalone.XML ??? espero respuestas muchas gracias colegas.
ok, probaré. muchas gracias
🙂
Hola!!. veo que el ejemplo es muy claro, sin embargo quisiera saber si hay forma de hacerlo desde una instancia en JBoss 7 acceder a EJB que corren sobre un JBoss 4.2, creo que el 7 no tiene ese jar jboss-client.jar. si alguien depronto sabe lo agradecería. (Y)
No lo he probado pero casi seguro que tendrás que diseñar EJBs 2x de los antiguos
Excelente manual, me fue de gran ayuda!
gracias 🙂
Hola Cecilio
siempre es necesario que el cliente tenga una dependencia al proyecto ejb ?
No tiene porque puedes usar un utility proyect y ubicar en el los interfaces y hacer referencia a ellos desde tu cliente
Disculpa, me pareció interesante la pregunta, solo que, como que no entendí muy bien a que se refieren ambos? si pudieras darme una pequeña descripción a lo que se refieren, te lo agradecería mucho…
y otra pregunta, para el fichero de propiedades de la conexión al servidor jboss, supongo que te basaste de este
https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/6.3/html/Development_Guide/sect-Invoking_Session_Beans.html
mi pregunta vendria siendo, si tienes un documento donde explique las partes que conforman la configuracion del fichero del servidor, donde te explique en que consisten o los parámetros que puede conformar dicho archivo de configuracion.
no,no tengo nada al respecto
hola de nuevo
lo probe en un jboss EAP sin ningun tipo de warning, funcionando 100%
Tengo una duda, como realizo un archivo EAR y como desplegarlo(es decir en tu imagen se nota que se ha desplegado en un archivo ear, pero a mi solo me aparece el archivo jar****espero y me entiendas)
Tienes que generar con eclipse un Enterprise aplication project y luego añadirle proyectos de ejb 🙂
hola que tal,
Tengo una duda, el programa corre, solo que me aparece este warning en el cliente
WARN: Unsupported message received with header 0xffffffff
utilizo jboss 7.1.1
Espero y me puedas ayudar
No te se decir cada servidor y cada versión es un mundo pero recuerda que en la plataforma de Jboss las versiones community no tienen porque ser perfectas . Para eso existen las versiones EAP (que son las de pago) . Así que podría ser incluso un bug del servidor.
Estimado Cecilio, me aparece el siguiente error:
mar 10, 2014 4:25:55 PM org.jboss.ejb.client.EJBClient
INFO: JBoss EJB Client version 1.0.5.Final
Exception in thread “main” java.lang.IllegalStateException: No EJB receiver available for handling [appName:JE,modulename:JEEV2-ejb,distinctname:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@537935
at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:584)
at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:119)
at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:181)
at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:136)
at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:121)
at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:104)
at com.sun.proxy.$Proxy0.mensaje(Unknown Source)
at com.arquitecturajava.cliente.Principal.main(Principal.java:25)
Java Result: 1
Me podrías dar alguna idea de que puede ser.
Saludos
Gabriel
Has desplegado bien el EJB en el Servidor ? .Cuando se despliega ves pasar ese proceso por la consola con el nombre que le asigna 🙂 .Comprueba que encaja con lo tuyo
Yo tuve el mismo problema que tu, y después de dar mil vueltas pude solucionarlo. Realmente JBoss no te da exactamente el despliegue que tienes que inyectar en el cliente dentro del context.lookup. En mi caso, jndi me devolvía entre otras:
java:global/EARClienteEJBRemoto/EJBRemoteService/WelcomeEJB!service.WelcomeEJBRemote
La cual no funciona. Como digo, después de mil vueltas la solución era:
context.lookup(“ejb:EARClienteEJBRemoto/EJBRemoteService//WelcomeEJB!service.WelcomeEJBRemote”)
Lo cual significa: ejb:Nombre_del_EARProject/Nombre_del_EJBProject//Clase_Cliente!paquete_ejbs.Clase_Interface_Remota
O sea, básicamente lo que Cecilio ha escrito en su post, pero cambiando con los nombres de tu aplicación, paquete, clases, etc.
Un saludo,
musef
gracias por el aporte 🙂
Cual es la diferencia entre java:global vs ejb: ?
global vale para cualquier recurso y ejb es el namespace para los ejbs por ejemplo en global podemos acceder a servicios jms etc.