我正在开发一个Web应用程序,我在前端运行Java,后端运行shell脚本。该应用程序主要是分析许多文件,java程序从用户获取输入,例如他们想要分析哪个文件,从哪个日期到他们想要分析的日期。让我们假设用户从7月1日到8日提供数据。我需要处理8天的文件。每天大约有100个文件需要处理。所以我的目标是并行执行此过程而不是执行此顺序。我基本上有两个想法。我想与你分享这个,并得到你的建议。
计划1: 有一个Java程序(Business Layer),它使用流程构建器调用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回调。有关如何进行此更新的任何想法。
答案 0 :(得分: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;
}
}
}
这只是一个非常粗略的解决方案,只是为了展示如何实现这一目标的想法。我没有测试代码,它可能包含语法错误:)希望这会有所帮助。