Tabla de Contenidos

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:

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). 

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.

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