在java中执行依赖任务

时间:2010-12-03 11:21:50

标签: java concurrency dependencies scheduled-tasks

我需要找到一种执行相互依赖的任务的方法。

  • 第一项任务必须从远程服务器下载zip文件。
  • 第二个任务目标是解压缩第一个任务下载的文件。
  • 第三项任务必须处理从zip中提取的文件。

所以,第三项依赖于第一项任务的第二项和第二项。 当然,如果其中一个任务失败,则不应执行其他任务。由于第一个任务从远程服务器下载文件,因此应该有一个重新启动任务的机制,即服务器不可用。 任务必须每天执行。

任何建议,模式或Java API?

问候!

7 个答案:

答案 0 :(得分:0)

您似乎不想将它们分成任务,只需这样做:

process(unzip(download(uri)));

答案 1 :(得分:0)

这取决于外部要求。有用户介入吗?监控?警报?...

最简单的方法显然只是检查前一个是否已完成应有的方法。

  1. download()将文件下载到指定位置。
  2. 如果下载的文件到位,
  3. unzip()会将文件解压缩到指定的位置。
  4. process()处理数据(如果已提取)。
  5. 更“正式”的方式是使用工作流引擎。根据需求,您可以获得一些功能,从花哨的UI到遵循正式标准化.XML工作流定义的一些功能 - 以及介于两者之间的任何功能。

    http://java-source.net/open-source/workflow-engines

答案 2 :(得分:0)

创建一个公共方法来执行任务的完整链和私有方法:

public void doIt() {
  if (download() == false) {
     // download failed
  } else if (unzip() == false) {
     // unzip failed;
  } else (process() == false)
     // processing failed
  }
}

private boolean download() {/* ... */}
private boolean unzip() {/* ... */}
private boolean process() {/* ... */}

所以你有一个API保证所有步骤都以正确的顺序执行,并且只有在满足某些条件时才执行步骤(上面的例子只是说明了这种模式)

答案 3 :(得分:0)

对于每日执行,您可以使用Quartz Framework

由于任务相互依赖,我建议您评估任务返回的错误代码或异常。如果上一个任务成功,则继续。

答案 4 :(得分:0)

执行这些任务的正常方法是:按顺序调用每个任务,并在发生故障时抛出异常,以防止执行以下任务。像

这样的东西
try {
  download();
  unzip();
  process();
} catch(Exception failed) {
  failed.printStackTrace();
}

答案 5 :(得分:0)

我认为您感兴趣的是某种交易定义 即
- 定义TaskA(例如下载)
- 定义TaskB(例如解压缩)
- 定义TaskC(例如流程)
假设您的意图是让任务独立工作,例如只下载一个文件(不执行任务B,TaskC)你应该定义由Transaction1组成的TaskA,TaskB,TaskCTransaction2组成的TaskA。 语义,例如关于 Transaction1 ,应按顺序执行TaskA,TaskB和TaskC,并且可以在您的交易定义中捕获全部或全部。 定义可以在xml配置文件中,您可以使用框架,例如石英用于调度。
更高的构造应检查事务并按定义执行它们。

答案 6 :(得分:0)

使用 Dexecutor

轻松执行相关任务

免责声明:我是图书馆的所有者

基本上你需要以下模式

enter image description here

使用 Dexecutor.addDependency 方法

 DefaultDexecutor<Integer, Integer> executor = newTaskExecutor();
//Building
executor.addDependency(1, 2);
executor.addDependency(2, 3);
executor.addDependency(3, 4);
executor.addDependency(4, 5);
//Execution
executor.execute(ExecutionConfig.TERMINATING);