在java中执行依赖任务

在java中执行依赖任务,java,concurrency,dependencies,scheduled-tasks,Java,Concurrency,Dependencies,Scheduled Tasks,我需要找到一种方法来执行相互依赖的任务 第一个任务必须从远程服务器下载zip文件 第二个任务的目标是解压缩第一个任务下载的文件 第三个任务必须处理从zip提取的文件 所以,第三个依赖于第二个,第二个依赖于第一个任务。 当然,如果其中一项任务失败,就不应该执行其他任务。由于第一个任务从远程服务器下载文件,因此当服务器不可用时,应该有重新启动任务的机制。 必须每天执行任务 有什么建议、模式或java API吗 问候 似乎您不想将它们分成任务,只需这样做: process(unzip(downlo

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

  • 第一个任务必须从远程服务器下载zip文件
  • 第二个任务的目标是解压缩第一个任务下载的文件
  • 第三个任务必须处理从zip提取的文件
所以,第三个依赖于第二个,第二个依赖于第一个任务。 当然,如果其中一项任务失败,就不应该执行其他任务。由于第一个任务从远程服务器下载文件,因此当服务器不可用时,应该有重新启动任务的机制。 必须每天执行任务

有什么建议、模式或java API吗


问候

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

process(unzip(download(uri)));

这在一定程度上取决于外部需求。是否有用户参与?监控?警报

最简单的方法显然只是检查前一个是否完成了它应该做的事情的方法

  • download()
    将文件下载到指定位置
  • unzip()
    如果下载的文件已就位,则将文件提取到指定位置
  • process()
    处理已提取的数据
  • 更“正式”的方法是使用工作流引擎。根据不同的需求,您可以得到一些可以做任何事情的UI,从花哨的UI到遵循正式的标准化.XML工作流定义的UI,以及介于两者之间的任何UI


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

    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,它保证所有步骤都以正确的顺序执行,并且只有在满足某些条件时才执行步骤(上面的示例仅说明了此模式)

    对于日常执行,您可以使用


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

    执行这些任务的正常方法是:;按顺序调用每个任务,并在出现阻止执行以下任务的故障时引发异常。差不多

    try {
      download();
      unzip();
      process();
    } catch(Exception failed) {
      failed.printStackTrace();
    }
    

    我认为您感兴趣的是某种事务定义。

    -定义
    TaskA
    (例如下载)
    -定义
    TaskB
    (例如解压缩)
    -定义
    TaskC
    (例如流程)
    假设您打算让任务也独立工作,例如只下载一个文件(不同时执行TaskB、TaskC),您应该定义由
    TaskA、TaskB、TaskC组成的
    Transaction1
    或仅由
    TaskA
    组成的
    Transaction2

    语义,例如关于事务1TaskA、TaskB和TaskC应按顺序执行,并且可以在事务定义中捕获全部或全部。
    定义可以在xml配置文件中,您可以使用框架(如Quartz)进行调度。

    更高的结构应检查事务并按照定义执行它们。

    相关任务的执行通过

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

    基本上,您需要以下模式

    使用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);
    
    DefaultDexecutor executor=newTaskExecutor();
    //建筑
    执行者。添加依赖项(1,2);
    执行人。添加依赖项(2,3);
    执行人。添加依赖项(3,4);
    执行者。添加依赖项(4,5);
    //执行
    executor.execute(ExecutionConfig.TERMINATING);
    
    它们都是相互依赖的,为什么要设置它们?没有用户参与,但如果任务A无法下载zip文件,则发出警报将非常有用。因此,您需要确定是否足够简单,可以通过编程完成所有任务,或者是否保证使用某些工作流引擎。一般来说,我拒绝使用框架,直到有了足够的收益。简单的独立代码更容易维护。我同意。但是我想到了使用一些java并发api。那么,你打算让其中的几个任务并行执行吗?是的,这可能是一个任务,有3个方法一个接一个地执行。如果服务器不可用,我会重复下载作业。然后将
    download
    重命名为
    downloadWithRetries
    ,让该方法调用
    download
    几次……这是最简单的方法,实现所有三种方法并将它们放在单个任务中。这可以通过java.util.timer完成