使用Play同时运行Schedules Jobs!骨架

时间:2011-06-09 23:37:12

标签: java playframework

我玩了!框架作业每30秒执行一次:

@Every("30s")
public class MyJob extends Job { ... }

这项工作做了一些事情,比如阅读电子邮件和写入数据库。但是,作业可能无法在30秒内完成。如果作业花费的时间超过30秒,我想终止在原始作业仍在进行时尝试启动的后续作业。有没有办法做到这一点?甚至暂停后续工作,直到原来的工作完成?

2 个答案:

答案 0 :(得分:10)

据我所知,你不必杀死这份工作。我创造了一项工作,而不是每分钟都要运行,但在某些情况下,它可能(可能)运行超过一分钟。

我做了一些测试,并且意识到我可能以错误的方式完成了它们,但Play不会启动Job的新实例(如果它已在运行)。一旦作业完成,它将在预期时间内运行下一个实例。就好像Play将Jobs视为“单身人士”一样,在给定时间只有一个特定类型的活动。

所以,不,你不需要杀死或检查任何东西。太棒了,不是吗? ;)

答案 1 :(得分:1)

您可以使用ReentrantLock来防止多个实例一次运行。像这样:

@Every("30s")
public class MyJob extends Job {
  /**
   * Used to avoid running multiple instances of this job simultaneously.
   */
  private static final ReentrantLock runningLock = new ReentrantLock();

  @Override
  public void doJob() {
    // sb: try to acquire the lock. if the lock is in use, then just
    // return immediately, because this job is already running.
    // wait a half second before giving up.
    if (!runningLock.tryLock(500, TimeUnit.MILLISECONDS)) {
      // maybe log a message here?
      return;
    }

    // IMPORTANT: ANY CODE ADDED TO THIS METHOD MUST BE INSIDE THE TRY OR
    // YOU RUN THE RISK OF FAILING TO RELEASE THE LOCK!

    try {
      // perform your job code here...
    } finally {
      // sb: we're finished; release the lock
      runningLock.unlock();
    }
  }
}

鉴于您的工作每30秒运行一次,没有理由在另一个工作正在运行时延迟工作 - 只需取消它。