以编程方式创建动态石英调度程序
我们可能需要创建一个 Quartz 调度程序,根据用户输入何时应该触发调度程序,除了我们可以处理的情况,我们有一些预先定义的功能,需要根据用户操作,在某个时间段。
此示例接收有关触发定时的用户输入,以触发调度程序。这是 ScheduledJobListener
类 imlements MessageListener
,其中包含在触发调度程序时要执行的业务逻辑。在配置所需的参数后,使用 SchedulerEngineHelperUtil
class 调度作业以触发作业:
- 触发(使用 cron 文本字符串和作业名称)
- 消息(使用 MessageListener 类和 portletId 的实现)
- 调度程序存储类型(默认情况下为 MEMORY_CLUSTERED,可以设置为 PERSISTED 以存储在 DB 中)
- 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 * * * ?";
在这种情况下,它每隔五分钟就会发射一次。
参考文献: