====== EJB - Tareas Programadas ====== Con el estándar EJB 3.1, es posible ejecutar tareas programadas en un determinado instante de tiempo. Para configurar una ejecución programada, solo tenemos que anotar el método publico de un EJB con la anotación //javax.ejb.Schedule//. En el ejemplo, la tarea se ejecutara cada 5 segundos. package org.jboss.seam.async; import static org.jboss.seam.annotations.Install.BUILT_IN; import javax.ejb.Schedule; import javax.ejb.LocalBean; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import org.jboss.seam.annotations.Name; @LocalBean @Stateless @Name( "org.jboss.seam.async.ejbScheduleTask" ) @TransactionAttribute( TransactionAttributeType.NOT_SUPPORTED ) public class EjbScheduleTask { /** * Lanza un evento de forma asincrona. * * @param asynchronousEvent * - Evento asincrono a lanzar */ @Schedule(second="*/5", minute="*", hour="*") public void scheduledMethod() { // scheduled execution code } } ===== Tareas Programadas en Cluster ===== Las tareas programadas en un cluster se ejecutaran al mismo tiempo en todos los servidores del cluster, y para determinadas tareas, puede ser un problema al acceder al mismo tiempo a recursos compartidos como la BBDD. Para evitar estos problemas, tenemos que realizar las siguientes tareas: * Poner un DUMBO o JIRA a Sistemas indicando que configuren los nodos manejados del clustes, con un cluster lógico de Weblogic. Con los siguientes datos: Asunto: Configurar la Aplicacion xxxxxxx en Cluster Texto de la tarea:: Necesitamos que todos los entornos de weblogic 12.2 tengan configurado el cluster lógico para poder hacer uso de las tareas planificadas (timer). * En la anotación //@Schedule// tenemos que poner la propiedad **//persistent// tiene que tener valor //true //**, o quitarla de la anotación (el valor por defecto es //true//). ==== Automatizar la copia del fichero weblogic-ejb-jar.xml ==== Para automatizar la copia del fichero //weblogic-ejb-jar.xml// y que solo se copie en entornos con cluster. * Para aplicaciones FundeWeb 1.5.x utilizamos el //seam-parent// versión 1.5.26 en el POM principal. * Para aplicaciones FundeWeb 2.0.x utilizamos el //parent// versión 2.0.28 en el POM principal. * También debemos asegurarnos que nuestro proyecto tiene las **//tareas Ant//** desde {{:fdw2.0:fundeweb2.0:gt:jenkins:builders.zip|este enlace}}. Cambiar [MIPROYECTO], por el nombre del proyecto. === Modulo EJB === Normalmente en aplicaciones **FundeWeb 1.5**. Para un módulo EJB, seguimos los siguientes pasos: 1. Creamos el fichero //weblogic-ejb-jar.xml// dentro de la carpeta //src/main/weblogic-cluster/META-INF// del módulo (sino existe la ruta de carpetas, se crea). Clustered 2. Añadimos en el POM la siguiente extensión (sino esta ya incluida) con //artifactId// //maven-fundeweb-extension// al final de la etiqueta ////: ... ... es.um.atica.fundeweb.maven.extensions maven-fundeweb-extension ... 3. Editamos el fichero POM del módulo. Y añadimos lo siguiente dentro de la etiqueta ////: ... weblogic12-cluster org.codehaus.mojo build-helper-maven-plugin add-ejb-resource generate-resources add-resource src/main/weblogic-cluster META-INF/weblogic-ejb-jar.xml \\ === Modulo WEB === Normalmente en aplicaciones **FundeWeb 2**. Para un módulo WEB, seguimos los siguientes pasos: 1. Creamos el fichero //weblogic-ejb-jar.xml// dentro de la carpeta //src/main/weblogic-cluster/WEB-INF// del módulo (sino existe la ruta de carpetas, se crea). Clustered 2. Añadimos en el POM la siguiente extensión (sino esta ya incluida) con //artifactId// //maven-fundeweb-extension// al final de la etiqueta ////: ... ... es.um.atica.fundeweb.maven.extensions maven-fundeweb-extension ... 3. Editamos el fichero POM del módulo. Y añadimos lo siguiente dentro de la etiqueta ////: ... weblogic12-cluster es.um.atica.fundeweb.maven.plugins maven-fundeweb-build-helper-plugin add-wls-cluster-webResources generate-resources add-webResource src/main/weblogic-cluster WEB-INF/weblogic-ejb-jar.xml ===== Notas ===== Hay que tener en cuenta que si en algún momento en nuestra tarea programada se hace uso de una instancia de Identity, esta será null porque no hay nadie logeado. ===== Bibliografia ===== * [[http://www.adam-bien.com/roller/abien/entry/simplest_possible_ejb_3_16|SIMPLEST POSSIBLE EJB 3.1 TIMER]] * [[https://docs.oracle.com/javaee/6/tutorial/doc/bnboy.html|The Java EE 6 Tutorial - Enterprise Beans - Using the Timer Service]] * [[http://kveeresham.blogspot.com.es/2013/03/timer-service-using-ejb-31.html|Timer Service Using EJB 3.1]] * [[https://www-01.ibm.com/support/knowledgecenter/SSEQTP_8.5.5/com.ibm.websphere.nd.doc/ae/tejb_timerserviceejb_enh.html|Creación de temporizadores con el servicio de temporizador EJB para enterprise beans]]