liferay Create a dynamic quartz scheduler programmatically


Example

There are specific scenarios where in we might need to create a Quartz scheduler,based on user input on when a scheduler should be triggered,apart from we can handle cases,where we have certain pre-defined functionalities,which need to be triggered based on user action,at a certain period.

This example receives user input on trigger timing,to trigger a scheduler.Here ScheduledJobListener class imlements MessageListener,which contains business logic to be executed on triggering the scheduler.The job is scheduled using SchedulerEngineHelperUtilclass to trigger the job,after configuring the required params:

  1. Trigger(using the cron text string and job name)
  2. Message(using implementation for MessageListener class and portletId)
  3. Scheduler storage types(which is MEMORY_CLUSTERED by default,can be set as PERSISTED to be stored in DB)
  4. DestinationNames(which is SCHEDULER_DISPATCH for Liferay) which decides Message Bus destination to be used

The below snippet is part of action phase of the portlet interacting with user,to create and schedule a quartz job.

   //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();
                }

Here,in order to create cron text,params are retrieved from user input For the cron text,we can also use the given reference for creating the cron pattern

    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.

and directly create a crontext string to be used based on user input

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

Here in this case,it fires after every five minutes.

References:

  1. Dynamic scheduler creation
  2. Scheduler application
  3. Quartz FAQs