0

我有一个运行 2 个独立的独立 java 轮询工具的场景,它将以 5 分钟的固定间隔运行一些特定的任务。

我的场景是(对于每个轮询服务):

1)如果任务 T0 需要超过 5 分钟才能运行,同时 5 分钟后 T5 来并尝试执行,我会丢弃它,而不是等待或重新启动(丢弃重叠任务)

2) 下一个任务将在 T10 正常开始。

我的问题是使用 Quartz 会过分吗?如果我使用 TaskExecutorService,我如何检查时间 X,一旦任务在时间 X-5 开始,我应该丢弃它。

注意:1)我必须使用JDK <= 6.0

2)我没有在像spring这样的任何框架下使用。

3)它是一个桌面工具,所以我需要启动它并且它会运行..

任何代码片段或方向表示赞赏。

更新以下评论的答案:

是的,它在单个工具中运行的任务之间。工具不同,工具之间没有联系,它们将单独运行,没有关系。

单个工具以 5 分钟的间隔运行相同的任务(就像每个文件分钟一样,它会在目录中查找文件,如果找到,则解析这些文件并使用它们)。

例如,如果任务当前从第一分钟开始运行(可能需要任何时间),则在 5 分钟后,该工具再次启动该任务以查找新文件,但这次它不会解析/使用它,因为前一个任务已经在运行处理一些文件。所以新任务将不会执行,系统将转储它(没有队列/没有等待/没有顺序作业)。

另一个新任务将再次运行 5 倍时间,如果没有其他任务在运行,它将解析和处理这些文件。

4

2 回答 2

1

在看到评论中问题的回复后,您可以使用Executors获取ScheduledExecutorService。然后,您可以使用方法scheduleWithFixedDelay来提交您的任务。此方法在运行之间有延迟重新运行任务。对您而言,好处是延迟计数在当前运行完成后开始。这将在不使用布尔变量或 ReentrantLock 的情况下为您提供所需的内容,因为您不会同时运行两个任务。您只需要小心捕获异常,因为异常会导致任务的后续运行被取消。

所以让我们假设你有一个 MyTask 实现 runnable

public class MyTask implements Runnable{

  public void run() {
     try {
           //your task code here
     } catch (...) {
        //deal with the exceptions here               
     }
  }

}

假设您将从 main 方法运行,您现在可以使用该类来安排重复发生的任务:

public class TaskRunner{

private static final ScheduledExecutorService taskScheduler = Executors.newScheduledThreadPool(1);

  public static void main(String[] args) {
    taskScheduler.scheduleWithFixedDelay(new MyTask(),0,5,TimeUnit.MINUTES);  
  }

}
于 2012-11-18T20:10:50.243 回答
0

解决方案很简单:使用 ScheduledThreadPoolExecutor.scheduleAtFixedRate(task, 5, min)。声明一个通用的布尔变量isRunning=false。每个任务在开始时都会检查这个变量,如果已经设置,则退出,否则将其设置为 true 并运行。最后,将其设置为 false。检查和设置应在同步块中完成。

于 2012-11-17T14:17:58.320 回答