====== 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]]