如何在Play Framework 2.3中编写定时任务(cron job)

6

我正在使用Play 2.3.8(activator)和Mongodb作为数据库。

我有一些产品在产品集合中,每个产品都有到期日期,一旦过期,我需要从产品集合中删除文档。

我计划编写定时任务来删除产品集合中的文档,该任务将在特定时间每天运行一次。

我想我可以使用Java中的注释,例如@on,@Every(我正在使用Play Java编写代码,而不是Play Scala)。但是当我搜索时,我得到了一些插件、工具或解决方案:

a) https://github.com/ssachtleben/play-plugins/tree/master/cron

b) Quartz Job schedular作为Play 2.3(activator)的依赖项

c) Akka异步作业(我不知道如何使用它,如何与play集成,甚至我对Akka很陌生)

我处于困惑状态,请您以下建议:

  1. 哪一个工具适合我的需求?

  2. 我是否在正确的路径上执行我的工作?

  3. 是否有任何可以在数据库级别上完成我的工作的东西?

  4. 谢谢。
3个回答

7
可以使用Global类并覆盖onstart方法来实现。具体信息请参考https://www.playframework.com/documentation/2.5.x/JavaGlobal。以下是编码的抽象视图。希望这可以帮助到您。
public class Global extends GlobalSettings {

private Cancellable scheduler;

@Override
public void onStart(Application application) {
    int timeDelayFromAppStartToLogFirstLogInMs = 0;
    int timeGapBetweenMemoryLogsInMinutes = 10;
    scheduler = Akka.system().scheduler().schedule(Duration.create(timeDelayFromAppStartToLogFirstLogInMs, TimeUnit.MILLISECONDS),
            Duration.create(timeGapBetweenMemoryLogsInMinutes, TimeUnit.MINUTES),
            new Runnable() {
                @Override
                public void run() {
                    System.out.println("Cron Job");
                    // Call a function (to print JVM stats)
                }
            },
            Akka.system().dispatcher());
    super.onStart(application);
}

@Override
public void onStop(Application app) {
    scheduler.cancel();
    super.onStop(app);
}

}

2
      Akka.system().scheduler().scheduleOnce(
          Duration.create(0, TimeUnit.MILLISECONDS),
          new Runnable() {
              public void run() {
                  Logger.info("ON START ---    " + System.currentTimeMillis());
              }
          },
          Akka.system().dispatcher()
  );

  Akka.system().scheduler().schedule(
          Duration.create(nextExecutionInSeconds(8, 0), TimeUnit.SECONDS),
          Duration.create(24, TimeUnit.HOURS),
          new Runnable() {
              @Override
              public void run() {
                  Logger.info("EVERY DAY AT 8:00 ---    " + System.currentTimeMillis());
              }
          },
          Akka.system().dispatcher()
  );

        Akka.system().scheduler().schedule(
                Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay 0 milliseconds
                Duration.create(60, TimeUnit.SECONDS),     //Frequency 30 minutes
                new Runnable() {

                    @Override
                    public void run() {
                        Logger.info("creating the runnable");
                        Logger.info("EVERY 60 MInutes ---    " + System.currentTimeMillis());
                        executeAllMongoAggregations();
                    }
                },
                Akka.system().dispatcher()
        );

    }      Akka.system().scheduler().scheduleOnce(
          Duration.create(0, TimeUnit.MILLISECONDS),
          new Runnable() {
              public void run() {
                  Logger.info("ON START ---    " + System.currentTimeMillis());
              }
          },
          Akka.system().dispatcher()
  );

  Akka.system().scheduler().schedule(
          Duration.create(nextExecutionInSeconds(8, 0), TimeUnit.SECONDS),
          Duration.create(24, TimeUnit.HOURS),
          new Runnable() {
              @Override
              public void run() {
                  Logger.info("EVERY DAY AT 8:00 ---    " + System.currentTimeMillis());
              }
          },
          Akka.system().dispatcher()
  );

        Akka.system().scheduler().schedule(
                Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay 0 milliseconds
                Duration.create(60, TimeUnit.SECONDS),     //Frequency 30 minutes
                new Runnable() {

                    @Override
                    public void run() {
                        Logger.info("creating the runnable");
                        Logger.info("EVERY 60 MInutes ---    " + System.currentTimeMillis());
                    }
                },
                Akka.system().dispatcher()
        );

    }

我们可以使用Quartz调度器吗?@Poornerd - Narendra
@Narendra 抱歉 - 我只使用过 Akka Scheduler。 - Brian Porter

1
在Play中,cron的角色是通过Akka Scheduler完成的 - 虽然示例非常简单,但它是非常强大的工具。
更多细节可以在Akka页面上找到,甚至在StackOverflow上也可以找到,例如如何在Play 2.0.4中每天安排任务+onStart()? - 这是一个2.0.4的示例,但你可以很容易地将其转换为2.3.x。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接