我需要找到一种执行相互依赖的任务的方法。
所以,第三项依赖于第一项任务的第二项和第二项。 当然,如果其中一个任务失败,则不应执行其他任务。由于第一个任务从远程服务器下载文件,因此应该有一个重新启动任务的机制,即服务器不可用。 任务必须每天执行。
任何建议,模式或Java API?
问候!
答案 0 :(得分:0)
您似乎不想将它们分成任务,只需这样做:
process(unzip(download(uri)));
答案 1 :(得分:0)
这取决于外部要求。有用户介入吗?监控?警报?...
最简单的方法显然只是检查前一个是否已完成应有的方法。
download()
将文件下载到指定位置。unzip()
会将文件解压缩到指定的位置。process()
处理数据(如果已提取)。更“正式”的方式是使用工作流引擎。根据需求,您可以获得一些功能,从花哨的UI到遵循正式标准化.XML工作流定义的一些功能 - 以及介于两者之间的任何功能。
答案 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,TaskC
或Transaction2
组成的TaskA
。
语义,例如关于 Transaction1 ,应按顺序执行TaskA,TaskB和TaskC,并且可以在您的交易定义中捕获全部或全部。
定义可以在xml配置文件中,您可以使用框架,例如石英用于调度。
更高的构造应检查事务并按定义执行它们。
答案 6 :(得分:0)
使用 Dexecutor
轻松执行相关任务免责声明:我是图书馆的所有者
基本上你需要以下模式
使用 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);