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 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).
<?xml version="1.0" encoding="UTF-8"?> <weblogic-ejb-jar xmlns="http://xmlns.oracle.com/weblogic/weblogic-ejb-jar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd http://xmlns.oracle.com/weblogic/weblogic-ejb-jar http://xmlns.oracle.com/weblogic/weblogic-ejb-jar/1.3/weblogic-ejb-jar.xsd"> <timer-implementation>Clustered</timer-implementation> </weblogic-ejb-jar>
2. Añadimos en el POM la siguiente extensión (sino esta ya incluida) con artifactId maven-fundeweb-extension al final de la etiqueta <build>:
<project> ... <build> ... <extensions> <extension> <groupId>es.um.atica.fundeweb.maven.extensions</groupId> <artifactId>maven-fundeweb-extension</artifactId> </extension> </extensions> </build> ... </project>
3. Editamos el fichero POM del módulo. Y añadimos lo siguiente dentro de la etiqueta <profiles>:
<profiles> ... <profile> <id>weblogic12-cluster</id> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <executions> <execution> <id>add-ejb-resource</id> <phase>generate-resources</phase> <goals> <goal>add-resource</goal> </goals> <configuration> <resources> <resource> <directory>src/main/weblogic-cluster</directory> <includes> <include>META-INF/weblogic-ejb-jar.xml</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
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).
<?xml version="1.0" encoding="UTF-8"?> <weblogic-ejb-jar xmlns="http://xmlns.oracle.com/weblogic/weblogic-ejb-jar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd http://xmlns.oracle.com/weblogic/weblogic-ejb-jar http://xmlns.oracle.com/weblogic/weblogic-ejb-jar/1.3/weblogic-ejb-jar.xsd"> <timer-implementation>Clustered</timer-implementation> </weblogic-ejb-jar>
2. Añadimos en el POM la siguiente extensión (sino esta ya incluida) con artifactId maven-fundeweb-extension al final de la etiqueta <build>:
<project> ... <build> ... <extensions> <extension> <groupId>es.um.atica.fundeweb.maven.extensions</groupId> <artifactId>maven-fundeweb-extension</artifactId> </extension> </extensions> </build> ... </project>
3. Editamos el fichero POM del módulo. Y añadimos lo siguiente dentro de la etiqueta <profiles>:
<profiles> ... <profile> <id>weblogic12-cluster</id> <build> <plugins> <plugin> <groupId>es.um.atica.fundeweb.maven.plugins</groupId> <artifactId>maven-fundeweb-build-helper-plugin</artifactId> <executions> <execution> <id>add-wls-cluster-webResources</id> <phase>generate-resources</phase> <goals> <goal>add-webResource</goal> </goals> <configuration> <webResources> <resource> <directory>src/main/weblogic-cluster</directory> <includes> <include>WEB-INF/weblogic-ejb-jar.xml</include> </includes> </resource> </webResources> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
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
- fdw2.0/fundeweb2.0/gt/tareas-programadas.txt
- Última modificación: 27/06/2024 12:23
- por MARIANO Array