Para llevar a cabo un proyecto a menudo requerimos de procesos en Background. Una solución muy extendida es desarrollar estas tareas con código aislado, usando tecnologías que permiten su ejecución y programarlas mediante herramientas propias del sistema operativo. Pues bien, para proyectos Liferay no es necesario optar por este tipo de soluciones: podemos desarrollar y programar tareas en nuestros propios plugins mediante Liferay Quartz Scheduler.
VentajasIcon
- Posibilidad de usar servicios de nuestro Back End.
- Unificación de código (mejora en seguimiento y tener el repositorio en común entre otros).
- Independencia de tecnologías y agentes externos.
- Sencillez.
Consideraremos que ya se dispone de un portlet. El framework usado es indiferente (MVC Portlet, JSP Portlet, etc.)
Veamos cómo podemos programar una tarea en Liferay:
- 1. Creación de la clase:
Dentro del portlet creamos una clase que implemente la interfaz ‘com.liferay.portal.kernel.messaging.MessageListener‘.
- 2. Implementar el método ‘receive()‘:
package com.sonicon.testSchedule;
import
com.liferay.portal.kernel.messaging.Message;
import
com.liferay.portal.kernel.messaging.MessageListener;
import
com.liferay.portal.kernel.messaging.MessageListenerException;
public
class
MessageListenerTest
implements
MessageListener {
@Override
public
void
receive(Message message)
throws
MessageListenerException {
//Código a ejecutar aquí
}
} Nuestro método ‘receive()‘ se ejecutará periódicamente en función de la configuración que definamos en el siguiente punto. - 3. Registrar la clase en Liferay:
Añadir el scheduler de la clase en ‘liferay-portlet.xml‘ (tras la etiqueta ‘<icon>‘ del portlet):<portlet>
...
<icon>/icon.png</icon>
<scheduler-entry>
<scheduler-event-listener-class>com.sonicon.testSchedule.MessageListenerTest</scheduler-event-listener-class>
<trigger>
<simple>
<simple-trigger-value>
30
</simple-trigger-value>
<time-unit>second</time-unit>
</simple>
</trigger>
</scheduler-entry>
...
</portlet>
Ya tenemos nuestra tarea programada. En este ejemplo sencillo, el scheduler se ha programado mediante un valor simple y se ejecutará cada 30 segundos. Otra opción para el registro de la clase, es usar la etiqueta ‘<cron>‘ del siguiente modo (que sustituiría a la etiqueta ‘<simple>‘):<scheduler-entry>
<scheduler-event-listener-class>com.sonicon.testSchedule.MessageListenerTest</scheduler-event-listener-class>
<trigger>
<cron>
<cron-trigger-value>0 15 10 ? * MON-FRI</cron-trigger-value>
</cron>
</trigger>
</scheduler-entry>
Un saludo y hasta la próxima.
Más InfoIcon
- Liferay Quartz Scheduler. Posibilidades de la etiqueta ‘<cron>‘: http://www.quartz-scheduler.org/documentation/quartz-2.1.x/tutorials/crontrigger