【问题标题】:Use Scheduler to execute/access task from Servlet使用调度程序从 Servlet 执行/访问任务
【发布时间】:2015-08-14 01:38:27
【问题描述】:

我想做的事: 如果我的 Web 应用程序(tomcat、java)上的用户执行了一个操作,并且在他再次执行之前经过了 1 周,我想给他发送一封电子邮件。 例如,某人在 2015 年 1 月 1 日执行了“赞”,然后在 2015 年 1 月 3 日执行了另一个“赞”,他将在 2015 年 1 月 10 日收到一封电子邮件(前提是他在之后不再执行任何“赞” 2015 年 1 月 3 日)。

如何执行: 最初,我想使用一个简单的 java.util.Timer 对象。 但是,我找不到为此 Timer 对象引用不同任务的方法。每次用户执行所述操作时,我都需要检查该用户是否已经存在任务,如果存在,我会从当前时间重新安排 1 周。但就像我说的,我无法使用 Timer 对象引用任务。

所以我研究了 cron4j 和 Quartz。 Cron4j 似乎更简单,所以我想使用它。 Cron4j.Scheduler 允许引用任务。 据我了解,我会为整个 Web 应用程序创建一个 cron4j.Scheduler 类的实例,然后根据需要为这个 Scheduler 类的一个实例安排其他任务。它是否正确? 如果是这样,我将如何执行此操作以便以后可以从 servlet 访问调度程序类的实例? (我想可能将调度程序的实例设置为 ServletContext 的属性。但是,为此我需要为每个 Web 应用程序执行一次 servlet。这是如何完成的?如果是,我该如何指定servlet 只执行一次?)

我欢迎任何对上述问题的回答或对我想做的不同方法的建议。

谢谢

【问题讨论】:

    标签: java servlets timer cron4j


    【解决方案1】:

    我会从另一个方向走。如果您存储点赞以及点赞的日期/时间戳等,则有一项日常工作,即查询所有在 7 天内最后点赞的用户。

    【讨论】:

    • 感谢您的回复。是的,我存储“喜欢”。我考虑过这种方法。我正在使用 MySQL,因此它将涉及创建一个事件和一个 UserDefinedFunction。所以,我只是认为这也需要一些研究(例如,我读到用户定义的函数必须用 C 编写)。但如果这是更合乎逻辑的解决方案,那么我会研究它。
    • 理论上我会定义一个日常任务(可能cron4j应该能够创建一个Java任务,如果没有,Quartz适合你)。此外,MySQL 有办法找到intervals,但是您只能通过本机查询使用它们,而不是在使用 JPA/QueryDSL/等时。
    • 你能给我一些关于在哪里初始化 cronj4 调度程序以及如何在 servlet 中获取该调度程序对象的指导吗?谢谢
    • 我使用 ScheduledExecutorService 实现了您的建议,如下所述:stackoverflow.com/a/9186070/3684479
    • 如果我有两个相同的实例正在运行(即:任务被调用两次,因为它在我的程序中),有什么建议吗?一个选项是数据库中的一个字段,用于说明任务是否运行。有更好的吗?我想其他人也遇到过这个问题。
    猜你喜欢
    • 1970-01-01
    • 2021-07-20
    • 2012-09-19
    • 2013-11-27
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多