1

I'm building functionality that will enable users to schedule recurring and non-recurring tasks. I need to save these schedules in the database and read active schedules once daily to see if they should be triggered today.

I am using spring/java. I fear if I write this logic myself it will be lacking and not as efficient as it could be.

Required schedule configurations are just like the Outlook calendar, except for being concerned with time. (probably easier to open outlook recurring meeting than read my rendition):

  • Actual Date
  • every Nth day, based on start date
  • every Nth business day, based on start date
  • every Nth week on one-to-many-selection(Sun,Mon,Tues,etc...), based on start date
  • the (1st,2nd,3rd,4th,last) (Sun,Mon,Tues,etc...) of every Nth month based on start date
  • day X of every y months, based on start date
  • every (jan,feb,mar,apr,etc..) Nth day each year
  • every (1st,2nd,3rd,4th,last) (Sun,Mon,Tues,etc...) of (jan,feb,mar,apr,etc..)


What is simple pattern for implementing this? Thanks for any help

4

2 回答 2

2

Quartz 作业调度程序

使用Quartz Job Scheduler Library可以轻松完成您正在寻找的内容。

它允许安排未来的事件,甚至可以使用cron语法。

项目页面摘录:

什么是 Quartz 作业调度库?

Quartz 是一个功能丰富的开源作业调度库,几乎可以集成到任何 Java 应用程序中——从最小的独立应用程序到最大的电子商务系统。Quartz 可用于创建简单或复杂的调度,以执行数十、数百甚至数万个作业;任务被定义为标准 Java 组件的作业,这些组件几乎可以执行任何您可以对其编程来执行的操作。Quartz Scheduler 包括许多企业级特性,例如对 JTA 事务和集群的支持。

Quartz 是免费使用的,在 Apache 2.0 许可下获得许可。

请参阅概述

例子#3

于 2014-05-15T16:12:31.470 回答
1

春天

如果您确实决定编写自己的逻辑并且由于您使用的是 Spring,那么您可以利用 Spring 提供的一些功能(spring-framework-reference

但我从来没有利用过它,因为我在获得我想要的东西方面面临许多挑战

QuartzInitializerServlet

另一种方法是使用内置的QuartzInitializerServlet。这种方法更加灵活,因为您可以获取调度程序实例并从那里实现您的逻辑

一个可用于初始化 Quartz 的 Servlet,如果在 Web 应用程序中配置为启动时加载 Servlet。

在某些情况下,使用这个启动 servlet 可能比使用 QuartzInitializerListener 更可取——即当您想在同一个应用程序中初始化多个调度程序时。

您需要将类似这样的内容添加到您的 WEB-INF/web.xml 文件中:

 <servlet>
     <servlet-name>
         QuartzInitializer
     </servlet-name>
     <display-name>
         Quartz Initializer Servlet
     </display-name>
     <servlet-class>
         org.quartz.ee.servlet.QuartzInitializerServlet
     </servlet-class>
     <load-on-startup>
         1
     </load-on-startup>
     <init-param>
         <param-name>config-file</param-name>
         <param-value>/some/path/my_quartz.properties</param-value>
     </init-param>
     <init-param>
         <param-name>shutdown-on-unload</param-name>
         <param-value>true</param-value>
     </init-param>
     <init-param>
         <param-name>wait-on-shutdown</param-name>
         <param-value>true</param-value>
     </init-param>
     <init-param>
         <param-name>start-scheduler-on-load</param-name>
         <param-value>true</param-value>
     </init-param>
 </servlet>

StdSchedulerFactory 实例存储在 ServletContext 中。您可以像这样从 ServletContext 实例访问工厂:

 StdSchedulerFactory factory = (StdSchedulerFactory) ctx
            .getAttribute(QuartzFactoryServlet.QUARTZ_FACTORY_KEY);
于 2014-05-16T03:25:57.850 回答