私はかなり新しい Java 開発者なので、解決する必要がある問題の解決策をどのように実装するかについて、コミュニティからのフィードバックと、提案された解決策に関するフィードバックを探しています。
詳細は省きますが、次のような要望があります。
- 大量のデータを処理してから、このデータに対して非常に一般的な方法で 7 つの手順を実行する必要があります。これを非常に効率的に、再起動可能で安全に、そして最も重要なことに分離された方法で実行するアプリケーション/フレームワークを既に持っています。この既存のフレームワークを活用することが重要です。
- 私は、データの多くの異なるインスタンスで、かなり短い期間でこれを行う必要があります。時間があれば、上記のフレームワークを介してシリアルにこれを実行しますが、実行しません。一部のデータを構築/分割/チェックサムする必要があり、他のデータを圧縮して送信するか、時間内に終了しません。
私の考えは、別のアプリケーション (「親」) で ProcessBuilder() 呼び出しのキューを使用して、別のアプリケーション内で既存のアプリケーション/フレームワーク (これを「子」と呼びます) を活用することです。このソリューションにより、親アプリケーションと子アプリケーションの両方で既存の再起動可能なフレームワークを活用できます。
これは見下されるアプローチですか?それは信頼できるアプローチですか?このアプローチが気に入らなくても、ProcessBuilder を使用してタスクをループすることが最善の選択肢であると判断した場合、どのように解決しますか?
疑似コードは次のようなものになります (幸いなことに、実際のコードはそれほど長くはありません)。
Class Task {
//contains all the information for the task we need to complete
String taskArgs;
}
Class TaskWatcher implements Runnable {
//constructor requires process object for Constructor
//boolean isFinished();
process.waitfor();
isFinished=true;
}
Class TaskOutStream implements Runnable {
//constructor requires process object & TaskWatcher object
//Receives and redirects output of process
}
Class Semaphore {
//constructor sets int threadCount (We'll call it "3" for now)
synchronized acquireThread{
while threadCount==0, wait();
threadcount--
}
synchronized releaseThread{
threadcount++
notify();
}
}
Class TaskThread implements Runnable (
// constructor requires Task Object
run() {
semaphoreObject.acquireThread();
Process p = ProcessBuilder.command("cmd text", "args").start();
tw = TaskWatcher(p);
ThreadOutStream(p, tw);
}
}
Class TaskRunner {
//Constructor requires ArrayList<Task>
//For each Task t
TaskThread thread = new TaskThread(t);
thread.start();
}
スレッドからのすべての「return;」が存在し、再起動機能が作業キュー (親) または実際の作業 (子) レベルから外部で処理されると仮定すると、このアプローチは意味がありますか? 失敗する運命にあるのでしょうか。
これをやらない本当の理由をまだ見つけられていませんか?