Java 同时运行使用Play调度作业!框架

Java 同时运行使用Play调度作业!框架,java,playframework,Java,Playframework,我有一个剧本!每30秒执行一次的框架作业: @Every("30s") public class MyJob extends Job { ... } 这项工作做一些事情,比如读电子邮件和给数据库写信。但是,作业可能无法在30秒内完成。如果作业耗时超过30秒,我希望在原始作业仍在进行时终止尝试启动的后续作业。有办法做到这一点吗?或者甚至暂停后续作业,直到原始作业完成其工作?您可以使用可重入锁定来防止多个实例同时运行。大概是这样的: @Every("30s") public class MyJob

我有一个剧本!每30秒执行一次的框架作业:

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

这项工作做一些事情,比如读电子邮件和给数据库写信。但是,作业可能无法在30秒内完成。如果作业耗时超过30秒,我希望在原始作业仍在进行时终止尝试启动的后续作业。有办法做到这一点吗?或者甚至暂停后续作业,直到原始作业完成其工作?

您可以使用
可重入锁定来防止多个实例同时运行。大概是这样的:

@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秒运行一次,那么没有理由在另一个作业运行时延迟该作业,只要取消它。

据我所知,您不必终止该作业。我创建了一个每分钟都必须运行的作业,但在某些情况下,它可能(可能)运行超过一分钟

我做了一些测试,并意识到我可能以错误的方式进行了测试,但是Play不会启动作业的新实例(如果它已经在运行)。一旦作业完成,它将在预期时间内运行下一个实例。就好像Play将作业视为“单件”,在给定时间只有一个给定类型的作业处于活动状态


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

是的,看起来确实如此!谢谢你,佩雷。