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
    }
 
 
}

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>
  • fdw2.0/fundeweb2.0/gt/tareas-programadas.txt
  • Última modificación: 04/11/2021 13:00
  • por JUAN MIGUEL BERNAL GONZALEZ