2012-02-16 10 views
1

を避けデザイン私は、configファイルを読み込み、設定ファイルで指定されたアプリケーション/プログラムを実行するツールを実装する必要があります。テストのための一種の自動ランナー。私はそれを行うプログラムを実装しましたが、私は依存壁にヒットしました。私の現在の設計ツールでは、設定ファイルを解析して、ProgramTypeのマップとジョブのリストを取得します。 ProgramTypeに基づいてRunnerクラスが選択され、初期化されます。ランナークラスはProgram srcの一部です。ツール、依存関係トラップ

//this is just a pseudo code 
pkg org.Tool 

class Tool { 
    //after parsing 
    runJobs(map) { 
    if(map.get() == ProgramType) 
     org.Tool.JobStats = org.ProgramType.Runner.run(Job) 
    } 
} 

pkg org.ProgramType 

class Runner { 
org.Tool.JobStats run(Job) { 
    if(Job = "certain job") 
    return CertainJob.run(Job) 
} 
} 

コンパイルされたorg.ProgramType。*;が必要です。 ProgramTypeをビルドするにはorg.Tool.Jobとorg.Tool.JobStatsが必要です。私が作成した「依存地獄」は明らかに非常に悪いデザインです。私は単純にProgramType jarを呼び出し、JobStats.txtファイルにJobStatsを格納し、jarの実行が終了したらファイルを読み込んで処理するという解決策がありました。このソリューションは、Jobsが多数の設定などで複数回実行されたり、扱うことができる* .txtファイルが多いため、受け入れられません。私は、私の問題のためのコンパイルソリューションを見たと思う。「部分コンパイル」ツール、ProgramTypeコンパイル、再コンパイルツールなど。しかし、私はそれを見つけることができない、また、それは "依存地獄"のパターンを取り除くことは賢明だろう。したがって、私の質問 "どのように私はこれを設計する必要がありますか"。

は、私は私の問題を解決するために、私はデザインパターンを探していました@aviadコメントに書いたように

を解決しよう(私は聞いていない場合の説明は、明確であることを願っています)。私はそれを "Dependency Inversion Principle"と呼んだ。ここで私はパターンを記述したpdf文書、その価値ある読書(http://www.objectmentor.com/resources/articles/dip.pdf)をリンクしています(別の良い説明http://java.dzone.com/articles/fun-modules)。あなたの助けをありがとう(私は本当にあなたが推薦したフレームワークが好きでした)。

+0

あなたはDependency Injectionについて話していますか?もしそうなら、Guiceをhttp://code.google.com/p/google-guice/ – tartak

+0

ここでチェックしてください。短い答え:みんなのように;さらに短く:反射 –

+0

カタロニア語 ヒントのためのThx私はそれを調べます。 @guido反射エラーが発生しやすく、維持しにくいですか? – alien01

答えて

1

私はあなたがSpringBatchフレームワークを使用することができれば、あなたはまだあなたのコードのほとんどを使用することができると思います。

スプリングバッチを使用することの利点は、すべてのハードジョブが既に(設定、マルチスレッド、持続性など)を行ったフレームワークであるということです。

基本的にあなたが実行する必要があるJavaプログラムが起動するバッチファイル\シェルスクリプトを実行して実行することができます

java -cp %JOB_CLASSPATH% %JOB_MAIN_CLASS_FULLY_QUALIFIED_CLASS_NAME% 

をだから私は、次のデザインを使用します:全体のソリューションがある

をSpringベースのアプリケーション。 設定を読み取り、showを実行するコントローラークラス(メインクラス)。コントローラークラスはジョブキューをジョブとその構成で設定します。その後、すべてのジョブがキューから取得され、Springバッチジョブがプログラムによってインスタンス化され、実行されます。

また、Javaからバッチファイル\シェルスクリプトを実行するためのCommons Execを使用することができます。

後で、(設定変更およびHTTP経由でのトリガーのジョブを有効にするためには)Webコンテナで実行するように移動することができます - あなたはQuartz FW

を使用する場合Spring Batch Admin

をチェックまたsceduled的にあなたのソリューションを実行することができますがんばろう!

+0

フレームワークの提案のためのThx、私もそれらを見ていきます。フレームワークは私の問題を解決しますが、私は外部のジャーを使わずに、J2SEでこれをどうやってやるべきか、もっと知りたいと思っていました。このタイプのアプリケーションのためのある種の「デザインパターン」。 – alien01