Entradas etiquetadas como ‘Java’
Glassfish + Quartz + EJB
Enviado por: Frank D. Martínez en General, Glassfish, Quartz en Marzo 8, 2009
Después de buscar infinitamente en internet como configurar Quartz en Glassfish para programar Jobs desde un EJB y no encontrar solución, decidí hacerlo desde cero y lo logré, como me dí cuenta que hay muchos post en los forums preguntando como hacer esto, decidí publicar el procedimiento. Ojalá les sirva.
Enfoque:
- Crear una aplicación Web que va a servir de servidor Quartz vía RMI.
- Configurar el Glassfish para que permita la conexión RMI entre los EJBs y la aplicación Web.
- Crear un EJB de prueba.
Crear una aplicación Web que va a servir de servidor Quartz vía RMI:
Crear una aplicación web normal con las siguientes bibliotecas en WEB-INF/lib:
- quartz-1.6.5.jar
- commons-collections-3.2.jar
- commons-logging-1.1.jar
Incluir un archivo quartz.properties en WEB-INF/classes con las siguientes entradas
org.quartz.scheduler.instanceName = Sched1
org.quartz.scheduler.rmi.export = true
org.quartz.scheduler.rmi.registryHost = localhost
org.quartz.scheduler.rmi.registryPort = 1099
org.quartz.scheduler.rmi.createRegistry = true
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
Agregar el listener en el web.xml:
<listener>
<listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
</listener>
Agregar el listener en el sun-web.xml:
<class-loader delegate="true"/>
Configurar el Glassfish para que permita la conexión RMI entre los EJBs y la aplicación Web:
Activar el Security Manager:
En la consola administrativa del Glassfish, entrar a [Configuration -> Security] y activar la casilla [Security Manager]
Editar el archivo server.policy que se encuentra en la carpeta config del dominio y agregar la siguiente regla:
grant codeBase "file:${com.sun.aas.instanceRoot}/applications/j2ee-modules/[web app name]/WEB-INF/lib/quartz-1.6.5.jar" {
permission java.security.AllPermission;
};
Obviamente hay que reemplazar [web app name] por el nombre real de nuestra aplicación web que hicimos al principio.
Bueno hasta aquí ya está listo el servidor Quartz, solo falta copiar el war en el autodeploy del dominio y hacer algun EJB para probar. Nota: hay que reiniciar el Glassfish después del autodeploy.
Crear un EJB de prueba:
Creamos un EJB que tenga los siguentes jars (bibliotecas) empacadas en el jar.
- quartz-1.6.5.jar
- commons-collections-3.2.jar
- commons-logging-1.1.jar
Ponemos un archivo quartz.properties en la raiz del jar con las siguientes entradas:
org.quartz.scheduler.instanceName = Sched1 org.quartz.scheduler.logger = schedLogger org.quartz.scheduler.rmi.proxy = true org.quartz.scheduler.rmi.registryHost = localhost org.quartz.scheduler.rmi.registryPort = 1099
Y listo, dentro de cualquier EJB podemos obtener el Scheduler así:
SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler();
Código completo del ejemplo:
Nota: Las bibliotecas (jars) fueron removidas, hay que descargarlas por aparte.