1

applicationContext.xmlのを介してロードされたSpringWebアプリケーションがありContextLoaderListenerますXmlWebApplicationContext。アプリケーションコンテキストにはQuartzスケジューラー(ここSchedulerFactoryBeanのように定義されています)がありますが、トリガーやジョブの詳細はありません。

このメインアプリケーションコンテキストのロード中に、独自のpluginApplicationContext.xmlファイルを含むいくつかの「プラグイン」JARをロードします。それぞれがメインの子としてにpluginApplicationContext.xmlロードされます。GenericXmlApplicationContextXmlWebApplicationContext

これらのプラグインにはQuartzJobBean、上記のスケジューラー内でスケジュールされたQuartzジョブ()が含まれている場合があります。スケジューリングはQuartzAPIを介してプログラムで実行する必要がありますが、これは私にとっては問題ありません。ジョブがトリガーされると、Quartzによって適切にインスタンス化され、が拡張されるため、を介しQuartzJobBeanて現在のデータを取得できます。ここでの問題は、ジョブがスケジュールされている場所の代わりに取得することです。したがって、プラグイン内で定義されたBeanを取得するために呼び出すことはできません。ApplicationContextsetApplicationContextXmlWebApplicationContextGenericXmlApplicationContextgetBean

私はこれらすべてが起こる理由をよく理解しています。しかし、それを処理するためのクリーンで再利用可能なソリューションを見つけることができません。私はすでにOSGiを見てきましたが、このプラグインシステムを既存のアプリケーションに実装しています。新しいプラグインシステムを最初から作成するのではなく、アプリケーション全体をOSGiに移行するのは大変な作業です。OSGiや他のプラグインフレームワークがこの種の状況にどのように対処するか知っていますか?

あなたの助けをどうもありがとう

4

2 に答える 2

2

これらすべての春の問題が発生するかどうかはわかりませんが、OSGiでこれらのことを実行しました。

人々がしばしば気付かないのは、既存のコードに変更を加えることなく、既存のアプリケーションにOSGiを埋め込むことができるということです。リチャードホールはここでそれを説明していますhttp://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html(APIは100%標準化されています)。

フレームワークがあれば、フレームワークでプラグインを実行できます。フレームワークがすべてのアプリケーションパッケージをエクスポートすることを確認する必要があります(org.osgi.framework.system.packages.extra起動プロパティを参照)。プラグインとアプリケーションは、サービスを介して通信できます。

Quartzを使用したことはありませんが、スケジューリングの経験はあります。Runnableサービスをcronのようなプロパティで登録します。

   @Component(properties = "cron = 1 * * * *")
   publicvoidSomeImplはRunnableを実装します{
     public void run(){
        ..。
     }
   }

次に、cron仕様に従ってそのサービスを呼び出すバンドルを作成する必要があります)。

于 2012-03-25T14:51:00.330 に答える
0

が良いアプローチであることに同意しますが、たぶんあなたは1つの巨大なアプリケーションコンテキストを(それらすべてを支配するために)単純にクレートすることができますか?pluginApplicationContext.xmlファイルに基づいて新しい子アプリケーションコンテキストを手動で開始する代わりに、次を追加するだけです。

<import resource="classpath:/pluginApplicationContext.xml"/>

そして、これによりすべてのプラグインが検索され、それらのBeanが単一のアプリケーションコンテキストにマージされます。アーキテクチャの観点からは、これはより悪いアプローチですが、起動時にすべてのプラグインを検出すると機能します。

于 2012-03-28T11:23:22.800 に答える