En este artículo veremos EJB - Enterprise JavaBeans. Esta tecnología es parte de la especificación Java EE. Tocaremos temas como:
- ¿Qué es EJB?
- ¿Cuál es la historia de EJB?
- ¿Qué tipos de EJB existen?
Una breve historia de EJB
En 1996, cuando el autor de este artículo tenía 5 años, Java ya era popular entre los desarrolladores. La razón de esto fue la API amigable, la recolección automática de basura, etc. Java fue ampliamente utilizado en los sistemas responsables del backend. Sin embargo, a pesar de todas las delicias del lenguaje, los programadores de esa época necesitaban cierta funcionalidad que aún no estaba implementada en el JDK. Estas necesidades fueron:- asegurar la persistencia de los datos;
- integridad de la transacción
- acceso competitivo a los datos (control de subprocesos múltiples);
- y muy probablemente algo más.
¿Qué es EJB?
EJB en cierto sentido es un término colectivo que, según el contexto, puede significar la tecnología Enterprise JavaBeans en sí en general o algún componente de software (bean) Enterprise JavaBean específico que forma parte de la tecnología EJB. La definición de EJB como tecnología se encuentra en Wikipedia: Enterprise JavaBeans (también utilizado a menudo como abreviatura EJB) es una especificación de una tecnología para escribir y soportar componentes de servidor que contienen lógica empresarial. Es parte de Java EE. Esta tecnología se utiliza normalmente cuando la lógica empresarial requiere al menos uno de los siguientes servicios y, a menudo, todos:- soporte para la persistencia de datos: los datos deben estar seguros incluso después de detener el programa. La mayoría de las veces se logra utilizando una base de datos;
- soporte para transacciones distribuidas;
- soporte para modificación de datos paralelos y subprocesos múltiples;
- soporte de eventos;
- soporte de nombres y directorios (JNDI);
- seguridad y restricción de acceso a los datos;
- soporte para instalación automatizada en el servidor de aplicaciones;
- acceso remoto.
tipos de EJB
Resumamos. Un EJB es una clase Java normal marcada con una de las anotaciones especiales. Estas clases se denominan beans. Dependiendo de con qué anotación esté marcada la clase, será representativa de uno u otro tipo de EJB (beans). Hay tres tipos principales de frijoles:- Beans controlados por mensajes (beans controlados por mensajes);
- Entity Beans: definidos en la especificación JPA (Java Persistence API) y utilizados para almacenar datos;
- Frijoles de sesión.
- apátrida (sin estado);
- con estado (con soporte para el estado de la sesión actual);
- singleton (un objeto para toda la aplicación; a partir de EJB 3.1).
Frijoles de sesión
Los beans de sesión, o beans de sesión, son un tipo específico de bean. Encapsulan la lógica empresarial que el cliente puede invocar mediante programación llamando a los métodos del bean. Una llamada a un método puede hacer:- localmente, por otra clase en la misma JVM que el bean de sesión;
- de forma remota, a través de la red, desde otra JVM, utilizando la tecnología Java RMI (Remote Method Invocation).
@Stateless
. Pongamos un ejemplo a continuación:
import javax.ejb.Stateless;
@Stateless
public class StatelessEjbExample {
public String sayHi() {
return "Hi, I'm Stateless EJB!";
}
}
Los beans de sesión que admiten el estado de la sesión actual (Stateful) retienen información sobre su estado entre llamadas del mismo cliente y finalizan su existencia ante una solicitud explícita del cliente. Esto se logra debido al hecho de que los beans con estado son únicos para cada cliente. Un ejemplo de tarea de la que se puede encargar este tipo de bean es mantener actualizado el carrito de la compra de una tienda online de cada usuario. El ciclo de vida de estos beans lo gestiona el contenedor EJB. Estos beans también se destruyen cuando el cliente sale. Estos frijoles también son bastante fáciles de crear. Esta es una clase Java marcada con la anotación Stateful
. Ejemplo a continuación:
import javax.ejb.Stateful;
@Stateful
public class StatefulEjbExample {
public String sayHi() {
return "Hi, I,m Stateful EJB";
}
}
Los beans de sesión singleton se inician una vez durante la vida útil de la aplicación y existen durante toda la vida útil de la aplicación. Estos beans están diseñados para situaciones en las que se debe compartir un estado entre todos los clientes. Al igual que los beans sin estado, en los beans independientes el desarrollador debe asegurarse de que el entorno dentro del bean esté organizado de manera segura para subprocesos. Pongamos un ejemplo de un bean Singleton, que es tan fácil de crear como sus contrapartes, que se discutieron anteriormente. Es fácil adivinar que se trata de una clase Java con la anotación @Singleton
. Sin embargo, en este caso hay que tener cuidado. Hay dos anotaciones, idénticas en sintaxis, pero diferentes en propósito y ubicadas en diferentes paquetes:
- javax.ejb.Singleton
- javax.inject.Singleton
javax.ejb
. Ejemplo a continuación:
import javax.ejb.Singleton;
@Singleton
public class SingletonEjbExample {
public String sayHi() {
return "Hi, I'm Singleton EJB!";
}
}
Beans controlados por mensajes
Los beans controlados por mensajes, o MDB, o beans controlados por mensajes, implementan cierta lógica empresarial, como los beans de sesión. Pero a diferencia de sus parientes, MDB tiene una diferencia importante. Los clientes nunca llaman directamente a los métodos MDB. Estos beans suelen actuar como escuchas de mensajes JMS (Java Message Service) y sirven para organizar el intercambio de mensajes asincrónicos entre partes del sistema. Un ejemplo de dicho mensaje sería una solicitud de entrega de inventario desde un sistema minorista automatizado a un sistema de gestión de suministros. A continuación se muestra un ejemplo de un bean MDB. A diferencia de los beans de sesión, su creación es un poco más interesante:import javax.annotation.Resource;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
@MessageDriven(mappedName = "jms/TestQueue")
public class MessageDrivenEjbExample implements MessageListener {
@Resource
private MessageDrivenContext messageDrivenContext;
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage msg = (TextMessage) message;
msg.getText();
}
} catch (JMSException e) {
messageDrivenContext.setRollbackOnly();
}
}
}
La anotación MessageDriven
convierte nuestra clase MDB en un bean. Dentro de la anotación, utilizando JNDI (lea sobre JNDI aquí ), se determina el nombre de la distribución JMS, de la cual nuestra clase se convierte en oyente. Además, nuestra clase implementa la interfaz MessageListener
y su método onMessage
. Este método se llamará cuando llegue algún mensaje de la cola/distribución con el nombre definido dentro de la anotación MessageDriven
.
Beans de entidad
Parte de la tecnología EJB es la especificación JPA. JPA, o Java Persistence API, es una especificación que proporciona mapeo relacional de objetos (ORM) de objetos Java (Entity beans) y proporciona una API para almacenar, recuperar y administrar dichos objetos. JPA le permite representar datos de una base de datos como objetos Java, así como guardar objetos Java como registros en la base de datos. No todas las clases pueden actuar como tales objetos, excepto los Entity beans. Entity Bean es una clase Java que representa una tabla en una base de datos. La visualización (mapeo) se logra mediante el uso de anotaciones especiales. Con su ayuda, se compara una clase Java con una tabla de la base de datos, así como los campos de una clase Java con los campos de una tabla de la base de datos. A continuación se muestra un ejemplo de un bean de entidad, con comentarios en el código:@Entity // Делает данный класс Entity бином
@Table(name = "employee") // "Связывает" данный класс с таблицей employee в БД
public class Employee implements Serializable {
@Id // Говорит о том, что поле ниже является первичным ключом
@GeneratedValue(strategy = GenerationType.AUTO) // Определяет тип генерации значений первичного ключа
private int id;
@Column(name="name") // "Связывает" поле ниже с полем name в таблице employee в БД
private String name;
@Column (name="age") // "Связывает" поле ниже с полем age в таблице employee в БД
private int age;
// getters and setters...
}
Vale la pena señalar que tiene sentido estudiar este tipo de frijol solo en el contexto del estudio de la especificación JPA.
Escribir una aplicación: EJB HelloWorld
En esta sección, escribiremos una pequeña aplicación Java EE HelloWorld, que implementaremos en el servidor GlassFish. Antes de leer este artículo, se recomienda encarecidamente que lea el artículo sobre cómo configurar su entorno local .-
Cree un nuevo proyecto Maven en IntelliJ IDEA.
Archivo -> Nuevo -> Proyecto...
-
Haga clic en Siguiente .
-
Complete los parámetros del proyecto Maven:
-
Haga clic en Finalizar
-
El proyecto ha sido creado y tiene la siguiente estructura:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.javarush.lectures</groupId>
<artifactId>ejb_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
</dependencies>
</project>
A continuación, puede pasar al código Java. Nuestra aplicación será la más sencilla. Tendremos 1 servlet y 1 EJB. Este será un bean de sesión sin estado. Dentro del EJB definiremos solo 1 método que devolverá la cadena “Hello World”. Primero que nada, creemos un paquete com.javarush.lectures
. Luego, dentro del paquete com.javarush.lectures
, crearemos nuestro bean: DemoEJB. El código del bean se proporciona a continuación:
import javax.ejb.Stateless;
@Stateless
public class DemoEJB {
public String helloWorld() {
return "Hello world!";
}
}
Como dije antes, todo es bastante sencillo. Nuestro siguiente paso es crear un servlet que pasará el valor del EJB como respuesta a la solicitud HTTP. Vale la pena señalar que los servlets no son el tema de este artículo, pero aun así necesitarás usarlos para demostrar EJB. Para hacer esto, creemos un nuevo servlet DemoServlet
en el mismo paquete que el EJB. Su código está a continuación:
@WebServlet("/helloWorld")
public class DemoServlet extends HttpServlet {
@EJB
private DemoEJB ejb;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write(ejb.helloWorld());
}
}
Aquí hay algunos comentarios breves sobre el código. Resumen @WebServlet("/helloWorld")
: define nuestra clase como un servlet que procesará solicitudes HTTP al punto final /helloWorld
. Nuestra clase tiene un campo: DemoEJB ejb
. Este es nuestro frijol definido anteriormente. Una anotación sobre un campo de clase: @EJB
realiza una inyección de dependencia (DI). Aquellos. La variable ejb se inicializa automáticamente con una nueva instancia cuando es necesario. Nuestra clase es descendiente de HttpServlet y anula uno de los métodos de la superclase: doGet
. Este método procesa solicitudes HTTP GET y toma dos parámetros: HttpServletRequest
y HttpServletResponse
. HttpServletRequest
Sirve para obtener información sobre una solicitud HTTP entrante. HttpServletResponse
necesario para generar una respuesta a una solicitud. Dentro del método, obtenemos el objeto PrintWriter
del objeto de respuesta ( HttpServletResponse
), usando el método getWriter()
. A continuación, podemos escribir algún valor en el objeto resultante usando el archivo write
. Que, de hecho, es lo que usamos al escribir en el PrintWriter
objeto -a el valor obtenido del EJB que definimos (el valor es la cadena “¡Hola mundo!”). El cliente que envió la solicitud HTTP recibirá este valor como respuesta a su solicitud. El siguiente paso es iniciar la aplicación en el servidor GlassFish Java EE. Para hacer esto, crearemos una nueva configuración, como se describe en el artículo sobre cómo configurar el entorno local . A continuación se muestra una captura de pantalla de la configuración finalizada para el proyecto actual. Asegúrese de tener instalado el servidor GlassFish antes de comenzar: después de crear la configuración de inicio, inicie la aplicación usando el menú Ejecutar -> Ejecutar 'ejb_demo' o usando la tecla de acceso rápido Shift+F10 . Después del lanzamiento, puede ver sus registros: Y también el navegador que se abre: Todo esto indica que la aplicación funciona según lo previsto.
Conclusión
En este artículo nos familiarizamos con EJB - Enterprise JavaBeans. Consideramos preguntas como:- ¿Qué es EJB?
- Historia de EJB
- Diferentes tipos de EJB
- Beans controlados por mensajes (beans controlados por mensajes);
- Beans de entidad: definidos en la especificación de entidades JPA (Java Persistence API) y utilizados para almacenar datos;
- Frijoles de sesión:
- apátrida (sin estado)
- con estado (con soporte para el estado de la sesión actual)
- singleton (un objeto para toda la aplicación; a partir de EJB 3.1)
GO TO FULL VERSION