0

フロントエンドで Java を実行し、バックエンドでシェルスクリプトを実行する Web アプリケーションを開発しています。アプリケーションは主に多くのファイルの分析に関するものであり、Java プログラムはユーザーから、どのファイルをどの日付からどの日付まで分析するかなどの入力を取得します。ユーザーが 7 月 1 日から 8 日までのデータを提供すると仮定します。8 日間のファイルを処理する必要があります。毎日、約 100 個のファイルを処理する必要があります。したがって、私の目標は、このプロセスを順次行うのではなく、並行して行うことです。これに関して、私は基本的に2つの考えを持っています。私はこれをあなたと共有し、あなたの提案を得たいと思っていました.

プラン 1: プロセス ビルダーを使用してシェル スクリプトを呼び出す Java プログラム (ビジネス レイヤー) があります。ユーザーが指定した日付を分割できますか。たとえば、(1-8) を 4 つのスレッドに分割し、各スレッドが 2 日間の操作を実行することはできますか? (1-2) スレッド 1 と (3-4) スレッド 2 のように続きます。このアプローチに従う場合、すべての長所と短所は何ですか。また、このアプローチによってスレッド間をどのように調整するか。

プラン 2: Java からシェル スクリプトを呼び出し、シェル スクリプト内で複数のプロセスを生成します。前述のように、プロセス 1 を生成して日付 (1-2) とプロセス 2 (3-4) のジョブを実行できます。の上。このアプローチのすべての長所と短所は何ですか。そして、処理された出力を単一のファイルに書き込んでいます。したがって、複数のプロセスがある場合、単一のファイルを複数のプロセスで更新するにはどうすればよいですか。

また、私の質問に関連するリンクの参照

重要: シェル スクリプト内で毎日何百ものログ ファイルを処理する必要があることを説明しましたが、私の要件の 1 つは、シェル スクリプト内のジョブのステータスに関してフロント エンド環境を常に更新することです (つまり、1 日目が完了しました)。 、2日目は完了など。シェル スクリプトから echo を実行して、Java から値を取得できることはわかっています。しかし問題は、ファイルを処理するループ内でシェル スクリプト内でエコーを実行すると、コールが終了し、Java からコールバックする必要があることです。この更新を実現する方法についてのアイデア。

4

1 に答える 1

1

まず、最適化の最初のルールを検討することをお勧めします。最適化しないでください。

それから、本当にそれを最適化する必要があると思うなら、私は最初のアプローチを選び、Javaで可能な限り多くのことをします。

1つのアプローチは次のとおりです。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 に答える