Buscar..


Observaciones

Un programador sirve para realizar tareas en segundo plano en ciertos intervalos definidos.

Según el portlet Liferay DTD

<! - El elemento de entrada del planificador contiene los datos declarativos de un planificador. ->

! ELEMENT entrada-planificador (planificador-descripción, planificador-evento-oyente-clase, disparador)

<! - El valor de descripción del programador describe un programador. ->

! ELEMENT programador-descripción (#PCDATA)

<! - El valor de la clase scheduler-event-listener debe ser una clase que implemente com.liferay.portal.kernel.messaging.MessageListener. Esta clase recibirá un mensaje en un intervalo regular especificado por el elemento desencadenante. ->

! ELEMENT scheduler-event-listener-class (#PCDATA)

<! - El elemento desencadenante contiene datos de configuración para indicar cuándo activar la clase especificada en scheduler-event-listener-class. ->

! ELEMENT gatillo (cron | simple)

Crear un planificador de cuarzo para mostrar alguna información

Para crear un programador, la entrada debe crearse en

liferay-portlet.xml

demostrando la clase del planificador y el valor de activación para el tiempo de activación del planificador

<portlet-name>GetSetGo</portlet-name>
        <icon>/icon.png</icon>
        <scheduler-entry>
        <scheduler-description>This scheduler logs User count from portal</scheduler-description>
            <scheduler-event-listener-class>com.example.scheduler.SchedulerSample</scheduler-event-listener-class>
            <trigger>
                 <simple>
                   <simple-trigger-value>
                     5
                   </simple-trigger-value>
                <time-unit>minute</time-unit>
            </simple>
            </trigger>
        </scheduler-entry>

La entrada dada proporciona

  1. Descripción del programador

  2. Nombre de clase, que implementa la clase MessageListener

  3. Disparador, que proporciona intervalos para definir el punto de disparo para el programador

    -Usando a Cron

    -Utilizando valor de disparo simple

En el ejemplo dado, el programador se activará cada 5 minutos.

A continuación necesitamos crear una clase de planificador.

package com.example.scheduler;

import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.messaging.Message;
import com.liferay.portal.kernel.messaging.MessageListener;
import com.liferay.portal.kernel.messaging.MessageListenerException;
import com.liferay.portal.service.UserLocalServiceUtil;

public class SchedulerSample implements MessageListener {

    @Override
    public void receive(Message arg0) throws MessageListenerException {
        Log log=LogFactoryUtil.getLog(SchedulerSample.class);
        
        try {
            log.info("User Count for portal:"+UserLocalServiceUtil.getUsersCount());
        } catch (SystemException e) {
            
            log.info("User count is currently unavailable");
        }
        
    }

}

Este programador simplemente muestra el número de usuarios del portal de salida después de cada intervalo de activación a la consola del servidor.

Crear un programador dinámico de cuarzo mediante programación

Hay escenarios específicos en los que podríamos necesitar crear un programador de cuarzo, basado en las aportaciones del usuario sobre cuándo debería activarse un programador, además de que podemos manejar casos, donde tenemos ciertas funcionalidades predefinidas, que deben activarse en función de Acción del usuario, en un determinado período.

Este ejemplo recibe la entrada del usuario en la temporización de activación, para activar un scheduler.Here ScheduledJobListener clase imlements MessageListener , que contiene la lógica de negocio para ser ejecutado en impulsar la petición scheduler.The está programado usando SchedulerEngineHelperUtil clase para desencadenar el trabajo, después de configurar los params requeridos:

  1. Activador (utilizando la cadena de texto cron y el nombre del trabajo)
  2. Mensaje (usando la implementación para la clase MessageListener y portletId)
  3. Los tipos de almacenamiento del programador (que es MEMORY_CLUSTERED por defecto, se pueden establecer como PERSISTED para ser almacenados en DB)
  4. DestinationNames (que es SCHEDULER_DISPATCH para Liferay) que decide el destino del Bus de mensajes que se utilizará

El siguiente fragmento de código es parte de la fase de acción del portlet que interactúa con el usuario para crear y programar un trabajo de cuarzo.

   //Dynamic scheduling
    String portletId= (String)req.getAttribute(WebKeys.PORTLET_ID);
                  
    String jobName= ScheduledJobListener.class.getName();
           
    Calendar startCalendar = new GregorianCalendar(year , month, day, hh, mm, ss);
    String jobCronPattern = SchedulerEngineHelperUtil.getCronText(startCalendar, false);
                                //Calendar object & flag for time zone sensitive calendar
    
    Trigger trigger=new CronTrigger(ScheduledJobListener.class.getName(),ScheduledJobListener.class.getName(), jobCronPattern);
            
    Message message=new Message();
    message.put(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME,jobName);
    message.put(SchedulerEngine.PORTLET_ID, portletId);
    
    try {
          SchedulerEngineHelperUtil.schedule(
                trigger,StorageType.PERSISTED,"Message_Desc",DestinationNames.SCHEDULER_DISPATCH,
                message,0);                    
         } catch (SchedulerException e) 
                {
                    e.printStackTrace();
                }

Aquí, para crear texto cron, los parámetros se recuperan de la entrada del usuario. Para el texto cron, también podemos usar la referencia dada para crear el patrón cron

    1. Seconds
    2. Minutes
    3. Hours
    4. Day-of-Month
    5. Month
    6. Day-of-Week
    7. Year (optional field)
    **Expression**     **Meaning**
    0 0 12 * * ?     Fire at 12pm (noon) every day
    0 15 10 ? * *     Fire at 10:15am every day
    0 15 10 * * ?     Fire at 10:15am every day
    0 15 10 * * ? *     Fire at 10:15am every day
    0 15 10 * * ? 2005     Fire at 10:15am every day during the year 2005
    0 * 14 * * ?     Fire every minute starting at 2pm and ending at 2:59pm, every day
    0 0/5 14 * * ?     Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day
    0 0/5 14,18 * * ?     Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day
    0 0-5 14 * * ?     Fire every minute starting at 2pm and ending at 2:05pm, every day
    0 10,44 14 ? 3 WED     Fire at 2:10pm and at 2:44pm every Wednesday in the month of March.
    0 15 10 ? * MON-FRI     Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday
    0 15 10 15 * ?     Fire at 10:15am on the 15th day of every month
    0 15 10 L * ?     Fire at 10:15am on the last day of every month
    0 15 10 L-2 * ?     Fire at 10:15am on the 2nd-to-last last day of every month
    0 15 10 ? * 6L     Fire at 10:15am on the last Friday of every month
    0 15 10 ? * 6L     Fire at 10:15am on the last Friday of every month
    0 15 10 ? * 6L 2002-2005     Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005
    0 15 10 ? * 6#3     Fire at 10:15am on the third Friday of every month
    0 0 12 1/5 * ?     Fire at 12pm (noon) every 5 days every month, starting on the first day of the month.
    0 11 11 11 11 ?     Fire every November 11th at 11:11am.

y cree directamente una cadena crontext para usar en función de la entrada del usuario

 String jobCronPattern="0 */5 * * * ?";

Aquí, en este caso, se dispara cada cinco minutos.

Referencias:

  1. Creación dinámica del planificador
  2. Aplicación de programador
  3. Preguntas frecuentes de cuarzo


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow