Java EE Batch es una de las especificaciones JSR 352 añadidas por la plataforma Java EE 7 . Esta especificación esta orientada a la creación de procesos batch dentro del mundo Java. Vamos a un una pequeña introducción a su funcionamiento.
Java EE Batch y Jobs
Los procesos Batch tienen varios conceptos importantes en cuanto a la especificación se refiere. Uno de los mas importantes es el de Job o trabajo , que se encarga de definir la estructura de un trabajo concreto.
Un trabajo puede estar compuesto de varios pasos o steps . Vamos a crear un nuevo proyecto Web y crear un trabajo. Para ello me voy a apoyar en Jboss Developer Studio.Esta herramienta permite la creación de un trabajo a través de un asistente .
El asistente nos creará en fichero denominado job.xml en el cual podemos definir los diferentes pasos de nuestro trabajo.
Cada uno de los pasos puede estar ligado a varios elementos que gestionan nuestros procesos batch .
En este caso vamos a ligarlos a 2 Batchlet que son las unidades más básicas a nivel de procesos Batch. Vamos a ver las modificaciones que tenemos que hacer al fichero XML.
<?xml version="1.0" encoding="UTF-8"?> <job id="job" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd" version="1.0"> <step id="paso1" next="paso2"> <batchlet ref="batchLet"></batchlet> </step> <step id="paso2"> <batchlet ref="batchLet2"></batchlet> </step> </job>
Acabamos de ver como enlazar dos Batchlet en nuestro proceso , es momento de construir su código.
package com.arquitecturajava.batch; import javax.batch.api.AbstractBatchlet; import javax.enterprise.context.Dependent; import javax.inject.Named; @Dependent @Named public class BatchLet extends AbstractBatchlet{ @Override public String process() throws Exception { System.out.println("paso uno del proceso batch"); return null; } }
package com.arquitecturajava.batch; import javax.batch.api.AbstractBatchlet; import javax.enterprise.context.Dependent; import javax.inject.Named; @Dependent @Named public class BatchLet2 extends AbstractBatchlet{ @Override public String process() throws Exception { System.out.println("paso dos del proceso batch"); return null; } }
Los Batchlet que acabamos de crear imprimen un mensaje por la consola del servidor. Vamos a invocar nuestro job desde un Servlet para ver como este trabajo se ejecuta.
import java.util.Properties; import javax.batch.operations.JobOperator; import javax.batch.runtime.BatchRuntime; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/ServletBatch") public class ServletBatch extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { JobOperator operador=BatchRuntime.getJobOperator(); operador.start("job", new Properties()); response.getWriter().append("proceso batch ").append(request.getContextPath()); } }
En este caso hemos usado el BatchRunTime que es el encargado de gestionar todos los procesos batch y le hemos solicitado un operador. El operador será el encargado de que lancemos el trabajo.
Podremos ver el resultado por la consola de JBoss acabamos de ejecutar nuestro primer ejemplo de Java EE Batch
Otros artículos relacionados: Java EE EJB , EJB remoto
Hola Cecilio,
Vengo trabajando con Spring Batch hace varios años, tampoco soy experto, pero me gustaría si es posible que hicieras una comparativa entre el batch estandar y el de spring. Sé que se basan en la mismsa JSR 352. Cómo aplicar en cada batchlet el reader, processor y writer?
Gracias
Uff ojala pudiera escribir de todo quizas en pluralsigth creo que hay un curso de eso 🙂 echale un veo
[…] Introducción a Java EE Batch : Uno de los nuevos aportes de Java EE 7 y que permitirá la ejecución de procesos batch dentro de los standards. […]
Gracias por el aporte, he aprendido mucho gracias a tu sitio.
Me alegro que te sea útil 🙂
No me queda claro cómo el servidor sabe cuál es la clase Java de cada batchlet, en base a lo declarado en el fichero job.xml. En dicho fichero no hay una referencia a la clase Java, ni tampoco la clase Java de cada batchlet tiene en ningún lado una referencia al Id declarado en el xml.
Usa el principio de convención sobre configuración , apoyandose en la anotación @Named. Una vez que hemos anotado los batchlets estos estan a nuestra disposición . Eso sí con el nombre empezando en minúsculas de ahí que no haga falta poner más.
Muchas gracias por la aclaración.
Muy útil el sitio, siempre con ejemplos sencillos y prácticos.