2012-07-18 60 views
0

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

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

计划2: 从Java调用shell脚本,并在shell脚本内产生多个进程,正如我前面所说,我可以产生进程1来完成日期(1-2)和进程2(3- 4),并继续。这种方法的优点和缺点是什么?我正在将处理后的输出写入单个文件。所以如果我有多个进程,我怎样才能让单个文件被多个进程更新。

而且关系到我的问题的任何链接的任何参考

重要: 正如我告诉我需要处理的日志文件100对一个shell脚本中的每一天,和我的要求之一就是不断更新我的关于我的作业在shell脚本(即)第1天已完成,第2天已完成等等的前端环境。我知道我可以通过shell脚本进行回应,然后我可以从Java获得价值。但问题是,如果我在shell脚本中执行一个echo,在处理文件的循环中,我的调用终止,并且我必须再次从Java回调。任何有关如何进行此更新的想法都会发生。

+0

为什么你需要使用shell脚本? – 2012-07-18 15:37:04

+0

我正在处理那些文件 – NandaKumar 2012-07-18 15:40:48

回答

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; 
     } 
    } 
} 

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

+0

谢谢你的解决方案。只是很想知道这是否会从Java环境本身产生多个进程。 List 和List 在哪里进入图片... – NandaKumar 2012-07-18 16:45:58

+0

ProcessBuilder将产生多个进程。首先,你必须做一个循环,产生所有的进程并把它们放到一个列表中。进程p = ProcessBuilder.start(); shellScriptProcesses.add(新的ShellScriptProcess(p))。实际上,在这种情况下,甚至不需要Process类的列表。 – vrepsys 2012-07-18 17:01:58

+0

雅这是我的问题....我也想知道..我可以编辑的代码,可以确保它是正确的? – NandaKumar 2012-07-18 17:09:41

相关问题