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