Enterprise JavaBeans (EJBs)
Cesar Julio Bustacara M.
Tier de Negocio
Tier de Negocio
Definición
●
Enterprise JavaBeans (EJBs)
– Componentes de software que:
●
Encapsulan la lógica de negocio
●
Son reusables
●
Son portables
●
Se ejecutan por medio de un contenedor
– Es una clase Java pública, que implementa los métodos de negocio e
implementa determinadas interfaces.
Tipos de EJBs
●
Para cumplir con la funcionalidad de la lógica de negocio, JEE
provee los siguientes tipos de EJBs:
– Sesión: Ejecuta una tarea para un cliente. Opcionalmente,
puede implementar servicios web
– Mensajeria: Actua como un listener para un tipo específico
de mensajes.
Tier de Negocio
Negocio Datos
Tier de Negocio – bajo acoplamiento
Negocio Datos
Fachada
Fachada
Tipos de EJBs de Sesión
●
Stateful: mantiene en el servidor el estado de la sesión del cliente
●
Stateless: no mantiene estado
●
Singleton: existe un sólo bean para toda la aplicación o sea para todos los
clientes por lo que soporta acceso concurrente
EJB de Sesión - Stateless
EJB Container – p.e. WildFly
1 Bean Pool Bean Pool
ues t No.
Req
Client 1 ResvServiceA ResvServiceB
2
ues t No.
Req ResvServiceA
es t No.3
Requ ResvServiceA
Client 2
EJB de Sesión - Stateful
EJB Container – p.e. WildFly
1
ues t No. ResvService
Req
Client 1
2
ues t No.
Req ResvService
es t No.3
Requ
Client 2
Elementos de los EJB de Sesión
Define los servicios públicos Define los servicios públicos
a los clientes remotos a los clientes locales
●
Clientes en máquinas diferentes
●
Clientes en JVM diferentes
●
Clientes en la misma JVM
●
Paso por valor
●
Paso por referencia
<<Interface>> <<Interface>>
Remote Local
Provee la implementación
<<Class>>
EJB (código java )
de las interfaces
Wildfly
Wildfly
Cliente
Logica Datos
JVM
Remote Remote
LogicaUsuario
ServiciosUsuario
Local
LogicaUsuario1
●
La vista de “no-interface” es una variación de la vista local
que expone todos los métodos públicos de negocio de manera
local sin exponer interfaces.
●
Los clientes que realizan llamadas remotas usan RMI o RMI-IIOP
Ejemplo interface Remote
@ expone interface
remota.
@ clientes en
diferentes VM ó en
diferentes nodos
BankAccountBean
@ expone interface
@ clientes en misma local.
VM
<<Local Interface>>
BankAccount
VerifierBankAccount
BankAccountBean
Ejemplo de un EJB de Sesión de tipo stateless
Interface Remote
import javax.ejb.Remote;
/**
* This is the business interface for Ejemplo01 enterprise bean.
*/
@Remote
public interface Ejemplo01Remote {
public Usuario validarUsuario(String userName, String password);
}
Interface Local
import javax.ejb.Local;
/**
* This is the business interface for Ejemplo01 enterprise bean.
*/
@Local
public interface Ejemplo01Local {
}
Implementacion del EJB
import javax.ejb.Stateless;
@Stateless (name=”Ejemplo01”)
public class Ejemplo01Bean implements Ejemplo01Remote, Ejemplo01Local {
@EJB ServiciosUsuarioLocal usuariosEJB;
/** Creates a new instance of Ejemplo01Bean */
public Ejemplo01Bean() {
}
public Usuario validarUsuario(String userName, String password){
List<Usuario> usuarios = usuariosEJB.findUsuario(userName, password);
return usuarios.get(0); //recuerden validar la lista
}
}
Aplicación cliente
import Ejemplo01.Ejemplo01Remote;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class Main {
public static void main(String[] args) {
try {
Context ctx = new InitialContext();
Ejemplo01Remote ejem = (Ejemplo01Remote) ctx.lookup("Ejemplo01Bean/remote");
System.out.println("Encontrada la referencia : " + ejem. validarUsuario(“admin”, “admin”));
} catch (NamingException ex) {
ex.printStackTrace();
}
}
}
Aplicación cliente2
import Ejemplo01.Ejemplo01Remote;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class Main {
public static void main(String[] args) {
try {
Hashtable environment = new Hashtable();
environment.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
environment.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
environment.put(Context.PROVIDER_URL, "jnp://localhost:1099"); // IP Maquina Remota
InitialContext context = new InitialContext(environment);
Ejemplo01Remote ejem = (Ejemplo01Remote) context.lookup("Ejemplo01Bean/remote");
System.out.println("Encontrada la referencia : " + ejem.getCadena());
} catch (NamingException ex) {
ex.printStackTrace();
}
}
}
EjemploEE01 - EJBs Stateless (WildFly 17)
Cliente java Servidor WildFly
LocalizadorServicios http FachadaLogicaBeanRemote
8080
http
Main FachadaLogicaBean
JNDI
Interface Remote
package logica;
import javax.ejb.Remote;
@Remote
public interface FachadaLogicaBeanRemote {
String servicio01(String text);
}
EJB Stateless
package logica;
import javax.ejb.Remote;
import javax.ejb.Stateless;
/**
* Session Bean implementation class FachadaLogicaBean
*/
@Stateless
@Remote(FachadaLogicaBeanRemote.class)
public class FachadaLogicaBean implements FachadaLogicaBeanRemote {
/**
* Default constructor.
*/
public FachadaLogicaBean() {
// TODO Auto-generated constructor stub
}
public String servicio01(String text) {
return ("Se recibió solicitud para el servicio01: " + text);
}
}
Cliente del EJB
import javax.naming.*;
import logica.FachadaLogicaBeanRemote;
public class Main {
public static void main(String[] args) throws NamingException {
// Crear el localizador de servicios
LocalizadorServicios serviceLocator = new LocalizadorServicios();
// Obtener la referencia remota usando el localizador de servicios
FachadaLogicaBeanRemote fachadaLogica = serviceLocator.getRemoteFachadaLogica();
// Invocar el servicio usando la referencia remota
System.out.println(fachadaLogica.servicio01("Servicio01"));
}
}
Localizador de servicios
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import logica.FachadaLogicaBean;
import logica.FachadaLogicaBeanRemote;
public class LocalizadorServicios {
public FachadaLogicaBeanRemote getRemoteFachadaLogica() throws NamingException {
return this.lookupFachadaLogicaBean("ejb:");
}
private FachadaLogicaBeanRemote lookupFachadaLogicaBean(String namespace) throws NamingException {
Context ctx = createInitialContext();
String appName = "";
String moduleName = "EjemploEE01";
String distinctName = "";
String beanName = FachadaLogicaBean.class.getSimpleName();
String viewClassName = FachadaLogicaBeanRemote.class.getName();
return (FachadaLogicaBeanRemote) ctx.lookup(namespace + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
}
private static Context createInitialContext() throws NamingException {
Properties jndiProperties = new Properties();
jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
jndiProperties.put(Context.PROVIDER_URL, "http-remoting://localhost:8080");
jndiProperties.put("jboss.naming.client.ejb.context", true);
return new InitialContext(jndiProperties);
}
}
Taller No.2
A ) Crear una aplicación de 2-niveles para manejar usuarios y autenticación
Contenedor EJBs
WildFly 19
8080
Servicios Negocio ServiciosDatos DB
Entidades
Taller No.2
B) Crear una aplicación de 3-niveles para manejar usuarios y autenticación
Contenedor EJBs Contenedor EJBs
WildFly 19.1 WildFly 19.2
8080 8090
Servicios Negocio ServiciosDatos DB
JVM
Entidades
Entidades
Wildfly
Wildfly
Cliente
Jboss-client.jar Logica Jboss-client.jar Datos
JVM
Remote Remote
LogicaUsuario
ServiciosUsuario
Local
LogicaUsuario1
Mysql-driver.jar
ServiciosLogica.jar ServiciosDatos.jar Datos.jar
Logica.jar