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

问题描述

| 我有戏!每30秒执行一次的框架作业:
@Every(\"30s\")
public class MyJob extends Job { ... }
这项工作可以做一些事情,例如阅读电子邮件和写入数据库。但是,作业有可能在30秒内未完成。如果作业花费的时间超过30秒,那么我想杀死在原始作业仍在进行中时尝试启动的后续作业。有没有办法做到这一点?甚至暂停后续工作,直到原件完成工作?     

解决方法

        据我了解,您不必取消工作。我创建的作业不是必须每分钟运行一次,但是在某些情况下,它可能(可能)运行超过一分钟。 我进行了一些测试,并意识到我可能以错误的方式进行了测试,但是Play不会启动Job的新实例(如果已经运行)。作业完成后,它将在预期的时间内运行下一个实例。就像Play将Jobs视为\“ Singletons \”一样,在给定的时间只有一个给定类型的活动。 因此,不,您不需要杀死或检查任何东西。太好了,不是吗? ;)     ,        您可以使用ѭ1阻止多个实例同时运行。像这样:
@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秒运行一次,因此没有理由在另一个作业运行时延迟作业-只需取消它即可。