2011-02-06 2 views
14

私の質問は、論理的な依存関係を持つタスクを管理し、同時に実行するためのフレームワークがJavaに存在するかどうかです。タスクを管理するためのJavaフレーム

私の仕事は以下の通りです: 私は独立した仕事がたくさんあります。(A、B、C、D ...)コマンドとして実装されています。私は、これらすべてのタスクを受け入れ、それらを並行して実行する一種のエグゼクティブを募集したいと思います。 タスクは互いに依存している可能性があります(たとえば、Cを実行する前に、Aを実行する前に)、同期または非同期です。

たとえば、タスクAとBがCPU集約型で、Cが高いメモリ消費量を持つ場合など、スケジューラの実行に影響を与えるカスタムヒューリスティックを組み込むこともできます。並列ではなくAとBを実行してください。

私はこのことを自分で構築する前に(私はjava.util.concurrent +注釈ベースの制約/ルールについて考えています)、誰かが私を指摘できるかどうか疑問に思っていました私のニーズに合ったプロジェクト。 ありがとうございました

+0

フォーク/参加を見たことがありますか? –

+0

タスクがそれぞれの結果を再利用するかどうかは疑問です。あらかじめ定義されたシーケンスを持つ独立した作業単位である場合、スケジューリングおよびカスタムヒューリスティックは、非常に単純なカスタムスレッドプールエグゼキュータによって解決できます。 –

+0

はい、java.util.concurrentからExecutor Servicesを使用することも考えていますが、タスクはそれぞれの結果を再利用するという点で独立しているようです。 Viktor Klangが親切にも提案したように、フォーク/ジョインを見てみるべきです。 –

答えて

7

あなたの要件を満たすことができるタスクを管理するためのフレームワークはないと思います。コマンドパターンを使用して正しいパスにいます。単純化された並行性モデルのためにAkka frameworkを見ることができます。アッカは、俳優・モデルに基づいています:

アクター・モデルは、別の非常に単純な 高いレベルの同時実行モデルである:一度に複数のメッセージ には対応できません アクターは(メッセージが メールボックスにキューイングされています) のメッセージのみを送信し、 の変数を共有することはできません。限りのメッセージが(Erlangで常に 真のですが、このプロパティを保証する手段 なしの言語で 大会である必要があります) 不変のデータ構造であるため、すべて は、他のどの を必要とせずに、スレッドセーフであります機構。これは、 と非常によく似ており、Webで見つかったサイクル 開発MVCフレームワークです。 http://metaphysicaldeveloper.wordpress.com/2010/12/16/high-level-concurrency-with-jruby-and-akka-actors/

アッカはScalaで書かれているが、それはきれいなのJava APIを公開しています。

2

この目的でantを使用する可能性を検討することをおすすめします。 antは一般的なビルドツールとして知られていますが、実際はさまざまなタスクを実行するXML制御エンジンです。私はその旗fork=trueがあなたが必要とするものを正確に行うと思います:タスクを同時に実行します。任意のJavaアプリケーションantが他のJavaアプリケーションから実行できるように:そのmainメソッドを呼び出してください。この場合、ant APIを使用してタスクをラップすることができます。つまり、それらをAntタスクとして実装できます。

私はこのアプローチを試みたことはありませんが、それはうまくいくはずです。私は数年前にそれについて考え、あなたのような問題の解決策として私の経営陣に提案しました。

+0

はい、このオプションについても考えました。それは私のニーズに合っているように見えますが、それ自身のやり方です:)このことを解決するために間違ったツールのように見えます。タスクは既に書かれています(大きな生産準備完了コードの一部です)。だから、これを解決するためだけに蟻を導入することは、過剰な殺人のように聞こえる。しかし、アドバイスをありがとう! –

+0

言及しないでください。私はあなたがアリが間違ったツールであると言っているとき、あなたに部分的に同意します。私はここでアリを使用することはその虐待だと思う。しかし、APIの乱用が役に立つことがあると私は信じています。私はこれについての記事を書いた:http://java.dzone.com/articles/useful-abuse – AlexR

0

特にdexecutor(免責事項:私は所有者だ)と呼ばれ、この目的のためのフレームワークがあり、このことは提供を行うための

Dexecutorは、信頼性の高い方法で依存/独立したタスクを実行するための非常に軽量フレームワークですが、最小限のAPI。

  • グラフ内のノードを追加するためのAPI(addDependency、addIndependent、addAsDependentOnAllLeafNodes、addAsDependencyToAllInitialNodesは、後者の2つは、最初の二つのハイブリッドバージョンである)
  • と順にノードを実行するために他の。ここで

最も単純な例である:ここでは

DefaultDependentTasksExecutor<Integer, Integer> executor = newTaskExecutor(); 

    executor.addDependency(1, 2); 
    executor.addDependency(1, 2); 
    executor.addDependency(1, 3); 
    executor.addDependency(3, 4); 
    executor.addDependency(3, 5); 
    executor.addDependency(3, 6); 
    //executor.addDependency(10, 2); // cycle 
    executor.addDependency(2, 7); 
    executor.addDependency(2, 9); 
    executor.addDependency(2, 8); 
    executor.addDependency(9, 10); 
    executor.addDependency(12, 13); 
    executor.addDependency(13, 4); 
    executor.addDependency(13, 14); 
    executor.addIndependent(11); 


    executor.execute(ExecutionBehavior.RETRY_ONCE_TERMINATING); 

は、依存関係グラフが一度これらのタスクの上の1,12,11が並行して実行します enter image description here

タスクを、構築される方法であります例えば、タスク1が終了し、タスク2と3がタスク12と同じように実行され、タスク13が終了するなどと言うことができます。

関連する問題