0

我正在开发一个 Web 应用程序,其中我在前端运行 Java,在后端运行 shell 脚本。该应用程序主要是关于分析许多文件,Java程序从用户那里获取输入,例如他们想要分析哪个文件,从哪个日期到他们想要分析的日期。假设用户提供7月1-8日的数据。我需要处理 8 天的文件。每天有大约 100 个文件需要处理。所以我的目标是让这个过程并行而不是顺序执行。对此我基本上有两个想法。我想和你分享这个,并得到你的建议。

计划 1:有一个 Java 程序(业务层),它使用流程构建器调用 shell 脚本。我可以将用户给定的日期(例如(1-8))拆分为 4 个线程,每个线程将执行两天的操作。例如(1-2)线程1和(3-4)线程2,它继续。如果我遵循这种方法,那么所有的优点和缺点是什么。还有如何通过这种方法在线程之间进行协调。

计划 2:从 Java 调用 shell 脚本并在 shell 脚本内部生成多个进程,正如我之前所说,我可以生成进程 1 来完成日期 (1-2) 和进程 2 (3-4) 的工作,然后就可以了在。这种方法的所有优点和缺点是什么。我正在将处理后的输出写入单个文件。因此,如果我有多个进程,如何让多个进程更新单个文件。

还有与我的问题相关的任何链接的任何参考

重要提示:正如我所说,我需要在 shell 脚本中每天处理 100 个日志文件,我的要求之一是不断更新我的前端环境,了解我在 shell 脚本中的作业状态(即第 1 天已完成) ,第 2 天已完成,依此类推。我知道我可以从 shell 脚本中回显,然后我可以从 Java 中获取值。但问题是,如果我在 shell 脚本中执行回显,在处理文件的循环中,我的调用将终止,我必须再次从 Java 回调。有关如何进行此更新的任何想法。

4

1 回答 1

1

首先,我建议考虑优化的第一条规则:不要优化。

然后如果你真的认为你需要优化它,我会选择第一种方法并尽可能多地使用 Java。

一种方法可能如下:1)使用 ProcessBuilder 运行所有进程并创建一个List<Process> 2)将每个进程包装到一个 ShellScriptProcess 并获取一个List<ShellScriptProcess>

class ShellScriptProcess implements Runneable() {

  private Process process;
  public ShellScriptProcess(Process process) {
     this.process=process;
  }

  boolean synchronized finished = false;
  public void run() {
    process.waitFor(); //this will wait until the process terminates
    finished = true;
  }
  public boolean isFinished(){
    return finished;
 }
}

3)等待进程完成

while(!allFinished) {
    for (ShellScriptProcess sp : shellScriptProcesses) {
      allFinished = true;
      if (sp.isFinished()) {
          // hurray, a process has finished, inform the UI
          // you want to do something smarter here though, 
          //like removing the finished processes from the list
      }
      else {
          allFinished = false;
      }
   }
}

这只是一个非常粗略的解决方案,只是为了展示如何实现这一点的想法。而且我没有测试代码,它可能包含语法错误:) 希望这会有所帮助。

于 2012-07-18T16:32:30.407 回答