Gestión de Transacciones en Jakarta EE: Lo básico

Gestión de Transacciones en Jakarta EE: Lo básico

La gestión de transacciones es fundamental e integral en las aplicaciones empresariales para garantizar la preservación de la consistencia e integridad de los datos. Una transacción, desde el punto de vista de una base de datos, representa una unidad lógica de trabajo que abarca una o múltiples operaciones de base datos(insertar, update, borrar).

Jakarta EE, al igual que su predecesor JavaEE, ofrece una abstracción integral para gestionar transacciones, ya sea programáticamente a través de las API de JTA o de manera declarativa mediante anotaciones. Esta última es más popular debido a su simplicidad y la capacidad de mantener límites de transacción claros sin abrumar el código lógico del negocio. En este artículo, exploraremos la anotación @Transactional en Jakarta EE, y veremos  diferentes comportamientos bajo varias configuraciones y algunas mejores prácticas.

La Anotación @Transactional

La anotación @Transactional es la que ofrece las capacidades de gestión de transacciones declarativas de Jakarta EE. Básicamente, cuando un método está decorado con @Transactional, Jakarta EE se asegura de que se inicie una transacción antes de la ejecución del método y posteriormente se confirme si la ejecución continúa normalmente, o se revierta si se produce una excepción.

Por defecto, la anotación @Transactional tiene un comportamiento de propagación REQUERIDO. Es decir, Si hay una transacción activa, únase a ella. Si no hay una transacción activa, inicie una nueva.

Vease:

https://jakarta.ee/specifications/transactions/2.0/apidocs/jakarta/transaction/transactional

Ejemplo:

@Stateless
public class MyService {

  @Inject
  private MyRepository repository;
  
  @Transactional
  public void performBusinessOperation() {
    // lógica del negocio
    repository.save(entity);
  }
}

Repository Code.

@Stateless
public class MyRepository {

  @PersistenceContext
  private EntityManager entityManager;
  
  @Transactional
  public void save(MyEntity entity) {
    entityManager.persist(entity);
  }
}

En el ejemplo anterior, invocar performBusinessOperation() inicializa una nueva transacción. Cuando save() se llama posteriormente dentro de esa transacción, save() se une a la transacción existente en lugar de iniciar una nueva debido a su comportamiento de propagación REQUERIDO por defecto.

Sin embargo, vale la pena señalar que el uso superfluo de anotaciones @Transactional, especialmente cuando las transacciones ya están definidas en la capa de servicio, puede provocar confusión y comportamientos no anticipados. Por lo tanto, generalmente es una buena práctica definir transacciones a nivel de operaciones comerciales (como en la capa de servicio).

Manejo de errores (RollBack/Deshacer)

La anotacion @Transactional no es magica, hay alcances y caracteristicas que se deben manejar como el asilamiento de la persistencia de datos y el RollBack, esto se logra lanzando excpeciones del tipo Runtime, si usa una excepcion custom, esta debe heredar o ser del tipo Runtime.

Mejores Prácticas

Los límites de transacción deben reflejar los requisitos comerciales. Por lo general, es recomendable iniciar una nueva transacción para cada operación comercial distinta. Las demarcaciones de transacciones suelen ser mejor ubicadas en la capa de servicio, que se alinea bien con la comprensión de las operaciones comerciales. Por otro lado, anotar cada método a nivel de repositorio puede hacer que cada operación CRUD sea transaccional y, en consecuencia, puede crear una multitud de transacciones breves.

Sin embargo, vale la pena considerar el costo de una transacción. Cuanto más larga sea una transacción, más tiempo persistirán los bloqueos en los datos, limitando las posibilidades de acceso concurrente a los datos.

Conclusión

Todo lo que es entendible es hackeable: Un sólido entendimiento de las transacciones y @Transactional es indispensable para diseñar aplicaciones empresariales robustas. Seleccionar límites y configuraciones precisas para sus transacciones es crucial para mantener la integridad de los datos, el rendimiento y la escalabilidad de sus aplicaciones. Si bien Jakarta EE simplifica significativamente las complejidades de la gestión con la anotación @Transactional, ser consciente de sus comportamientos bajo diferentes configuraciones es crucial.


Jakarta EE: Aplicación monolitica con Java Server Faces.

Con el auge de los microservicios se podria pensar que el tipo aplicaciones monolitcas, ntier, hibridas o distribuiridas estan muertas, pero no es así, estas aun tienen una gran parte del mercado y son una solucion viable, sobre todo para aplicaciones pequeñas , empresas pequeñas, startups o midlewares medianos.

¿que es una aplicación monolitica?

Una aplicacion monolitica es aquella cuyos componentes estan estrechamente ligados de tal forma que cada uno de las clases o archivos dependen uno del otro. Una aplicacion monolitica puede estar formada por 1 o cientos de archivos en una sola carpeta, y para poder hacer funcionar se requieren todo los archivos o componente, logicamente representan toda la solución, en Java, son entregados en un archivo JAR , WAR o EAR.

¿Que es Java Server Faces?

JavaServer Faces (JSF) es un framework de desarrollo de aplicaciones web Java que se utiliza para simplificar la creación de interfaces de usuario en aplicaciones web utilizando el concepto llamado: Server side render.

¿que es “Server-Side Rendering” (SSR)?

Es una técnica utilizada en el desarrollo web para generar y renderizar contenido web en el servidor antes de enviarlo al navegador del usuario. A diferencia de las aplicaciones de representación del lado del cliente (Client-Side Rendering o CSR), donde la mayor parte del procesamiento y la renderización ocurre en el navegador del cliente, en SSR, gran parte de este trabajo se realiza en el servidor.

Esto tiene la notable ventaja que los componentes visuales pueden serreutilizados , ademas permite al equipo de desarrollo centrarse en la logica de negocio y no en la apariencia, permitiendo acelerar el desarrollo y simplicar el mantenimiento.

Esta tecnologia fué un BOOM en el 2005 al 2015, actualmetne con el auge de las apliaciones distribuidas, los microservicios y los servicios rest que permitieron la proliferacion de los frameworks javascript estan cada vez en menos uso, pero son bien apreciados en muchas empresas.

Frameworks que utilizan SSR

  • JavaServer Faces (JSF): es un marco de desarrollo web Java que permite la creación de aplicaciones web con representación del lado del servidor.
  • Thymeleaf: Thymeleaf es un motor de plantillas Java que permite la creación de páginas web con representación del lado del servidor. Es especialmente popular en combinación con el marco Spring.
  • Spring Boot: Si está utilizando Spring Boot como su marco de desarrollo, puede implementar SSR combinando Spring Boot con Thymeleaf u otras tecnologías de plantillas.
  • JSP (JavaServer Pages): JSP es una tecnología de Java EE que permite la creación de páginas web dinámicas con representación del lado del servidor. Aunque se ha vuelto menos popular en comparación con otras tecnologías de plantillas, todavía se utiliza en algunas aplicaciones Java legadas.
  • Vaadin: Vaadin es un marco de desarrollo de aplicaciones web en Java que ofrece una interfaz de usuario rica y permite la representación del lado del servidor. Es especialmente útil para aplicaciones empresariales.

Librerias Java Server Faces

  1. PrimeFaces: PrimeFaces es una biblioteca de componentes de código abierto muy popular para JSF. Ofrece una amplia variedad de componentes ricos y temas personalizables para mejorar la apariencia y la funcionalidad de las aplicaciones JSF.
  2. RichFaces: RichFaces es otra biblioteca de componentes para JSF que proporciona componentes AJAX ricos y herramientas para mejorar la experiencia del usuario en aplicaciones web JSF.
  3. BootsFaces: BootsFaces combina JSF con Bootstrap, el popular framework de diseño web, para facilitar la creación de aplicaciones web modernas y receptivas con JSF.
  4. IceFaces: IceFaces es una biblioteca de componentes JSF que se centra en proporcionar funcionalidad AJAX avanzada para aplicaciones JSF, lo que permite una experiencia de usuario rica y dinámica.
  5. Apache MyFaces: MyFaces es un proyecto de código abierto de la Apache Software Foundation que ofrece una implementación de JSF. Incluye un conjunto de componentes y herramientas para el desarrollo de aplicaciones JSF.
  6. OmniFaces: OmniFaces es una biblioteca de utilidades que complementa JSF y resuelve diversos problemas comunes en el desarrollo de aplicaciones JSF. Ofrece un conjunto de extensiones útiles.
  7. Mojarra (Oracle JSF Reference Implementation): Mojarra es la implementación de referencia de JSF proporcionada por Oracle. Aunque es una implementación estándar de JSF, se utiliza comúnmente en aplicaciones JSF.
  8. Cuban Platform: Cuban Platform es un conjunto de herramientas y bibliotecas que extienden JSF y otros marcos de Java para el desarrollo de aplicaciones empresariales.

En este articulo vamos a trabajar con PrimeFaces.

https://primefaces.org/showcase/index.xhtml?jfwid=c972f

Creando aplicación web empresarial paso a paso:

Se puede comenzar a crear la aplicacion desde el website de jakarta o desde el IDE. El startup de jakarta nos permite una gran configuracion inicial para nuestro proyecto.

  1. Crear el proyecto, para esto utilizaremos IntelliJIDEa

Codigo del ejercicio:

El codigo del ejercicio lo pueden encontrar en github del grupo:

https://github.com/berroteran/demoJakarta10JSF

Posibles problemas y soluciones.

Referencias:

https://blog.payara.fish/getting-started-with-jakarta-ee-9-jakarta-faces-jsf

https://blog.payara.fish/a-quick-look-at-faces-jsf-4.0-in-jakarta-ee-10

https://github.com/eclipse-ee4j/mojarra

https://primefaces.github.io/primefaces/12_0_0/#/?id=main

Ejemplos que te pueden ser utiles:

https://github.com/aturanj/java-jakarta-primefaces


Crear un archivo EAR usando MAVEN

En el STACK java existe un archivo EAR que no es mas que un archivo ZIP con una estructura especifica. EAR (Enterprise Application aRchive) /

Un EAR normalmente contiene 2 archivos contenedores mas, un WAR (Web Archive) y un EJB , un archivo que contiene los EJB, sin embargo puede contener muchos mas (técnicamente no tiene limites), incluyendo clientes de EJB, EJB locales, pero el mínimo de todo EAR es uno, un modulo o contenedor, el cual puede ser un WAR o un EJB.

Prerequisitos

Java 1.4, Maven 3.6.3

Creando el proyecto vía comando.

mvn archetype:generate -DgroupId=com.ejemplo.demo.ear -DartifactId=simple-ear -DarchetypeArtifactId=wildfly-javaee7-webapp-ear-archetype -DarchetypeGroupId=org.wildfly.archetype -DinteractiveMode=false

Usando el archetype “maven-archetype-quickstart”

$ mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DarchetypeVersion=1.4 \
-DgroupId=mtitek.maven.ear.samples \
-DartifactId=mtitek-maven-ear-samples \
-Dpackage=mtitek.maven.ear.samples \
-Dversion=1.0.0-SNAPSHOT \
-DinteractiveMode=false

Donde se usa un EAR

Actualmente dada la gran popularidad de Spring-Boot casi no se ven EAR, pero en el otro lado, fuera de spring-boot, en los servidores empresariales como: JBOSS, websphere, Apache TomEE, Wildfly.

Ejemplo de un proyecto EAR

Creando el EAR usando JetBrains IntelliJ IDEa

Usando el IDE para crear el proyecto gráficamente.

Creando un proyecto, paso uno.

Click en Crear.

Así queda el proyecto y puede eliminar a su gusto.

Referencias

  • https://en.wikipedia.org/wiki/EAR_(file_format)
  • https://maven.apache.org/plugins/maven-ear-plugin/
Configuración y puesta en marcha de servidor WildFly 26 Server

Configuración y puesta en marcha de servidor WildFly 26 Server

Wildlfly es de los servidores mas usados en aplicaciones empresariales java, es muy potente, configurable, digno heredero de JBOSS, con muchos features, sin ser complicado. (Excepto features avanzados)

1. Descargar

Lo primero es descargar el programa, lo puedes hacer en este link:

https://www.wildfly.org/downloads/

Opciones de descarga

La opción que generalmente se descarga es la full EE y distribución web, sea para windows o para linux.

En windows el contenedor ZIP es el mas común, para Linux: tgz.

La versión preview se usa para pruebas, aun no recomendable para un ambiente de producción.

2. Configurar

Una vez descargado y «descomprimido», se puede iniciar Wildfly, pero aun no está listo para usarse.

Para poder desplegar nuestras aplicaciones es necesario poder acceder a la consola, la consola administrativa solo se accede desde la versión FULL descargada, las version “Servlet-Only Distribution” se usa para servidores esclavos o gestionados en dominio.

2.1 Agregar usuarios.

Lo primero es crear uno o mas usuarios administrativos, aunque se pueden editar los archivos, se recomienda usar las herramientas creadas para ello, en windows son archivos batch(.bat) y en linux shell script (.sh).

Comandos de Wildfly

En la carpeta “bin” están los comandos para gestionar el servidor.

./add-user.sh
Dejar en blanco para los grupos inicialmente.
Contestar yes para terminar de agregar el usuario.

3. Iniciar

Para iniciar el servidor la forma mas común es “standalone” la otra opción es via “dominio”, esta es para cundo tengamos un cluster de servidores.

 ./standalone.sh 

Listo, ya tenemos iniciado el servidor sirviendo las aplicaciones en el puerto 8080, y la consola administrativa en el 9990, con esto ya podemos instalar las aplicaciones web que sea necesario sea archivo WAR o EAR.

Para entrar a la consola administrativa usa el siguiente link:

http://192.168.30.216:9990/console/index.html

Ventana de inicio de sesión.

Opciones para desplegar aplicaciones

.

Opción para cargar una aplicación web java.

Instalando Netbeans en GNU/Linux Debian.

Introducción

Eclipse actualmente es IDE (entorno de desarrollo integrado) preferido por los desarrolladores de Java, pero aquí le ofrecemos otro sabor para degustar: NetBeans. Es un IDE libre y gratuito, desarrollado principalmente para el lenguaje de programación Java, aunque también tiene soporte para otros lenguajes de desarrollo como PHP, C/C++, HTML5. Además, cuenta con numerosos módulos que le ayudan a extender sus capacidades. ¿Quieres saber más?

Instalación.

Desde repositorio.

NetBeans se puede instalar directamente desde el repositorio de Debian con las siguientes sentencias:

sudo apt update #actualizar tabla de paquetes
sudo apt upgrade #actualizar sistema
sudo apt install netbeans #Instala netbeans con sus dependencias.

Debian se caracteriza por ser un sistema muy estable, esto lleva a que sus paquetes no estén en su versión más reciente, pero podemos optar por instalar NetBeans directamente de los desarrolladores descargando el instalador de la pagina oficial.

Desde los desarrolladores.

Primer paso:

Para descargar NetBeans 11 de la página oficial podemos pulsar este enlace o bien podemos descargarlo utilizando la siguiente sentencia desde la terminal del gestor de escritorio que usted esté utilizando.

wget https://www-us.apache.org/dist/incubator/netbeans/incubating-netbeans/incubating-11.0/incubating-netbeans-11.0-bin.zip

Segundo paso:

Descomprimir el archivo descargado del sitio oficial de los desarrolladores. Puedes hacerlo ejecutando la siguiente sentencia desde la terminal:

unzip incubating-netbeans-11.0-bin.zip

Tercer paso:

La carpeta (netbeans) que se descomprimió del incubating-netbeans-11.0-bin.zip,por ser un paquete agregado al sistema desde una fuente de terceros, debe estar en la carpeta /opt (¿Quieres saber más?). Por lo anterior, procedemos a mover la carpeta netbeans al directorio /opt, utilizando la siguiente sentencia desde la terminal:

sudo mv netbeans /opt/

Es recomendable que la carpeta /opt, esté en una partición diferente de la carpeta raíz (/), ya que si haces cambios en el sistema no tendrá que volver instalar NetBeans.

Cuarto paso:

NetBeans requiere del Java Development Kit para que podamos ejecutarlo. La versión que instalamos soporta el OpenJDK 11, el cual viene por defecto en Debian buster.

Procedemos a instalar el OpenJDK 11 desde el repositorio de Debian, ejecutando la siguiente sentencia desde una terminal:

sudo apt update #actualizar tabla de paquetes
sudo apt upgrade #actualizar sistema
sudo apt install default-jdk #Instala java jdk 11 con sus dependencias.

Comprobamos que la versión de Java que se nos instaló sea la versión 11 utilizando la siguiente sentencia desde la terminal:

java --version
openjdk 11.0.4-ea 2019-07-16
OpenJDK Runtime Environment (build 11.0.4-ea+10-post-Debian-1)
OpenJDK 64-Bit Server VM (build 11.0.4-ea+10-post-Debian-1, mixed mode)

Una vez que instalamos y comprobamos la versión correcta de JDK, podemos iniciar NetBeans desde una terminal con la siguiente sentencia:

/opt/netbeans/bin/netbeans

Después de ejecutar la sentencia veremos las siguientes pantallas.

 

 

IDE Netbeans

Agregaremos la ubicación del directorio netbeans a nuestro $PATH para que podamos iniciar el programa sin especificar la ruta absoluta al archivo binario. Modificando con el editor de texto de su preferencia, el archivo ~/.bashrc para el intérprete de órdenes bash (¿Quieres saber más?) el archivo ~/.zshrc para intérprete de órdenes zsh (¿Quiere saber más?), agregamos la siguiente línea al final del archivo y guardamos el cambio.

export PATH=”$PATH: /opt/netbeans/bin”

Reiniciamos el intérprete de órdenes que estemos utilizando, con la siguiente sentencia.

source ~/.bashrc #para el interprete bash

O

source ~/.zshrc #para el interprete zsh

Ahora ya podemos ejecutar NetBeans desde la terminal sin tener que digitar la ruta donde se encuentra el binario.  Sin embargo, puede resultar poco productivo abrir una terminal para ejecutar NetBeans si contamos con un menú  lanzador de aplicaciones. Por lo tanto, agregaremos al menú lanzador de aplicaciones un lanzador para que ejecute NetBeans:

Creamos el archivo /usr/share/applications/netbeans.desktop utilizando nuestro de editor de texto preferido. En el ejemplo utilizo el editor de texto nano de la siguiente manera:

sudo nano /usr/share/applications/netbeans.desktop

Digitamos el siguiente contenido al archivo /usr/share/applications/netbeans.desktop y guardamos la modificación.

[Desktop Entry]
Comment=Ide Netbeans apache
Exec=/opt/netbeans/bin/netbeans
Icon=/opt/netbeans/nb/netbeans.png
Name=NetBeans apache
NoDisplay=false
StartupNotify=true
Categories=GNOME;Application;Development;
Type=Application
StartupNotify=true
Terminal=0

Ahora ya tenemos NetBeans instalado y configurado para ejecutar desde el menú lanzador, en el cual veremos algo así.

Quinto paso [Configuración opcional de Netbeans]:

Para hacer ajustes en NetBeans, tenemos que modificar con nuestro editor de texto preferido el archivo /opt/netbeans/netbeans.conf. Aunque con la configuración que viene con la instalación NetBeans trabaja bien, procuro siempre agregar tres opciones que ayudan a minimizar el tiempo de arranque y dar mejor rendimiento cuando estás trabajando con varios proyectos.

-J-Xms1024m -J-Xmx2048m -J-Xverify:none

Estas opciones se deben agregar a la configuración netbeans_default_options, que se encuentra en el archivo /opt/netbeans/netbeans.conf.

sudo nano /opt/netbeans/netbeans.conf

Agregamos las opciones y guardamos, lo opción de configuración, netbeans_default_options, nos quedaría así:

netbeans_default_options="-J-XX:+UseStringDeduplication -J-Xss2m -J-Xms1024m -J-Xmx2048m -J-Xverify:none -J-Dnetbeans.logger.console=true -J-Djdk.gtk.version=2.2 -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true -J-Dplugin.manager.check.updates=false -J-Dnetbeans.extbrowser.manual_chrome_plugin_install=yes -J--add-opens=java.base/java.net=ALL-UNNAMED -J--add-opens=java.base/java.lang.ref=ALL-UNNAMED -J--add-opens=java.base/java.lang=ALL-UNNAMED -J--add-opens=java.base/java.security=ALL-UNNAMED -J--add-opens=java.base/java.util=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing.text=ALL-UNNAMED -J--add-opens=java.desktop/javax.swing=ALL-UNNAMED -J--add-opens=java.desktop/java.awt=ALL-UNNAMED -J--add-opens=java.desktop/java.awt.event=ALL-UNNAMED -J--add-opens=java.prefs/java.util.prefs=ALL-UNNAMED -J--add-opens=jdk.jshell/jdk.jshell=ALL-UNNAMED -J--add-modules=jdk.jshell -J--add-exports=java.desktop/sun.awt=ALL-UNNAMED -J--add-exports=java.desktop/java.awt.peer=ALL-UNNAMED -J--add-exports=java.desktop/com.sun.beans.editors=ALL-UNNAMED -J--add-exports=java.desktop/sun.swing=ALL-UNNAMED -J--add-exports=java.desktop/sun.awt.im=ALL-UNNAMED -J--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED -J--add-exports=java.management/sun.management=ALL-UNNAMED -J--add-exports=java.base/sun.reflect.annotation=ALL-UNNAMED -J--add-exports=jdk.javadoc/com.sun.tools.javadoc.main=ALL-UNNAMED -J-XX:+IgnoreUnrecognizedVMOptions"

Hasta aquí ya tenemos instalado, configurado NetBeans para ser utilizado en Debian.

Si tienes interés en la instalación de Eclipse, puedes revisar estos artículos:

Instalando Eclipse en Fedora Linux para aplicaciones web

 

 

Nosotros y terceros seleccionados utilizamos cookies o tecnologías similares con fines técnicos y, con su consentimiento, para otras finalidades (“interacciones y funcionalidades básicas”, “mejora de la experiencia”, “medición” y “segmentación y publicidad”) según se especifica en la política de cookies. Usted es libre de otorgar, denegar o revocar su consentimiento en cualquier momento.    Configurar y más información
Privacidad