以程式設計方式建立動態石英排程程式

我們可能需要建立一個 Quartz 排程程式,根據使用者輸入何時應該觸發排程程式,除了我們可以處理的情況,我們有一些預先定義的功能,需要根據使用者操作,在某個時間段。

此示例接收有關觸發定時的使用者輸入,以觸發排程程式。這是 ScheduledJobListenerimlements MessageListener,其中包含在觸發排程程式時要執行的業務邏輯。在配置所需的引數後,使用 SchedulerEngineHelperUtilclass 排程作業以觸發作業:

  1. 觸發(使用 cron 文字字串和作業名稱)
  2. 訊息(使用 MessageListener 類和 portletId 的實現)
  3. 排程程式儲存型別(預設情況下為 MEMORY_CLUSTERED,可以設定為 PERSISTED 以儲存在 DB 中)
  4. DestinationNames(Liferay 的 SCHEDULER_DISPATCH)決定要使用的訊息匯流排目標

下面的程式碼片段是 portlet 與使用者互動的動作階段的一部分,用於建立和安排石英作業。

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

這裡,為了建立 cron 文字,從使用者輸入檢索 params 對於 cron 文字,我們也可以使用給定的引用來建立 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.

並根據使用者輸入直接建立要使用的 crontext 字串

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

在這種情況下,它每隔五分鐘就會發射一次。

參考文獻:

  1. 動態排程程式建立
  2. 排程程式應用程式
  3. 石英常見問題解答