2

一連のプラグインを実行するアプリケーションを設計しています。プラグインの実行は、別のプラグインの実行に依存する場合と依存しない場合があります。つまり、一部の (すべてではない) プラグインは、実行を開始する前に他のプラグインが実行されることを期待しています。

依存しているプラ​​グインの前にプラグインが実行されないように、正しい実行順序を導き出す必要があります。

グラフ理論を使用してこれを解決できると思います (プラグインを頂点として、依存関係をエッジとして、何らかのトラバーサルを使用して実行順序を導出します)。

アプリケーションは Java で開発されているため、JGraphT を使用する予定です。

ケースを解決するためのヘルプまたはポインター??? Javaコード全体を期待しているわけではありません.グラフ理論(使用するアルゴリズム)に関するポインタはすべて同様に役立ちます....

ありがとう !!!

[解決策:] @Artium は解決策につながります。このリンクは非常によく似た実装を示しています。

4

2 に答える 2

3

トポロジカルソートをお勧めします。

簡単なチェックの後、JGraphTで簡単に実行できます。また、次のことに注意してください。

この反復子が正しく機能するには、グラフが非循環的である必要があり、反復中に変更してはなりません。現在、それを保証する手段もフェイルファストする手段もありません。循環入力 (自己ループを含む) または同時変更の結果は未定義です。サイクルのグラフを事前チェックするには、CycleDetector または StrongConnectivityInspector の使用を検討してください。

于 2011-06-25T10:56:45.233 に答える
0

プラグインがまだロードされていない場合は、プラグインが依存するすべてのプラグインをロードします。

いくつかの観察:

  1. 依存関係ツリーが非常に深い場合 (> 1,000 プラグイン)、StackOverflowException が発生する可能性があります。
  2. このソリューションは、すべてのプラグインが 1 つずつ同期的にロードされると仮定すると、スレッドセーフです。
  3. 「グラフ」で不正なサイクルを見つけることは、すべての依存関係をロードする前に設定され、プラグインが初期化された後にのみ設定startingされるフラグを使用して処理されますtruefalse
  4. このケースは、プラグインが別のプラグインを明示的に開始する状況を処理します (依存関係の一部としてではなく、非同期の初期化を考慮していません)。

アイデアを提供するためのテストされていないサンプルを次に示します。

class Plugin {
    Set<Plugin> dependencies;
    boolean started, starting;

    Plugin(Set<Plugin> deps) { dependencies = deps; }

    void start() {
        if (started) { /* already initialized */ }
        else if (starting) { throw new IllegalArgumentException("Cyclic plugin dependency"); }
        else {
            starting = true;
            for (Plugin p : dependencies) { p.start(); }
            /* initialize this plugin here */
            starting = false;
            started = true;
        }
    }
}
于 2011-06-25T11:08:44.603 に答える