問題タブ [spring-dm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
117 参照

spring - Spring DM (Dynamics Modules)、OSGI および Greenpages アプリケーション

「Greenpages app」は、Eclipse Virgo サイトで入手できるサンプル Web アプリケーションで、OSGI と Spring DM を一緒に使用する例を提供し、Virgo コンテナーにデプロイできます。http://www.eclipse.org/virgo/samples/を参照してください。エラーなしでアプリを実行できました。しかし、 org.springframework.osgi.context.event.OsgiBundleApplicationContextListenerインターフェースを実装しようとするとすぐに、すべてがうまくいかず、次のエラーが発生し始めます。

java.lang.IllegalArgumentException: 必要なプロパティ 'bundleContext' が設定されていません

OsgiBundleApplicationContextListener インターフェースは、BundleContext イベントをリッスンする方法を提供します。参照: http://docs.spring.io/osgi/docs/current/api/org/springframework/osgi/context/event/OsgiBundleApplicationContextListener.html

私のコード:

public class ApplicationContextObserver implements OsgiBundleApplicationContextListener { private transient int countRefreshed = 0; プライベート トランジェント int countClosed = 0;

}

そして宣言された豆:

最悪の場合、このエラーがまったく表示されないことがありますが、コンテナーに別のバンドルをデプロイすると、リスナーが呼び出されません。

何がうまくいかないのですか (可能であれば、Virgo Container、SpringDM、およびこのリスナーを使用して実行中の例を添付できますか)?

0 投票する
2 に答える
950 参照

spring - Spring モノリス アプリケーションから OSGI への移行

過去 10 年間、Spring を依存性注入として使用して、2 つのアプリケーション スイートを構築してきました。spring-batch と spring-amqp も使用します。現在、OSGI への移行を検討しています。これにより、モノリシック アプリケーションを複数のバンドルに分割して、より機敏性を高めることができます。2 つのスイートは Web アプリケーションであり、2 つの個別の war ファイルとしてデプロイされます。OSGI ランタイムとして Apache Karaf を使用する予定です。

Spring-DM は廃止され、依存関係の注入にブループリントを使用するには、すべてを変換する必要があるようです。

私の質問は、これを段階的に行う方法です。このすべてを一度に変換することは不可能に近いでしょう。バンドル アクティベーターのサービス レジストリに必要なサービスを公開する責任がある限り、1 つのバンドルで Spring DI を使用し、独自のアプリケーション コンテキストを持つことができるように思われますが、存在するかどうかはわかりません。トランザクション管理のように失われる魔法のようなものです。

これに関するガイダンスをいただければ幸いです。

0 投票する
0 に答える
475 参照

java - Spring-DM から Blueprint への切り替え: JDBC ドライバー クラス 'com.mysql.jdbc.Driver' を読み込めません

アプリケーションがあり、Apache の Servicemix 4.5.3 から Servicemix 6.1.0 にアップグレードしました。また、Apache Commons dbcp から dbcp2 および pool2 にアップグレードしました。このアップグレード後に気づいたことの 1 つは、バンドルの起動とシャットダウンが非常に遅いことでした。それで、Google で調べてみると、Spring-DM は非推奨であり、Blueprint に置き換えられることがわかりました。そのため、すべてのバンドルで Spring-DM 構成を Blueprint に置き換えたところ、起動とシャットダウンがはるかに高速になりました。

ただし、この操作の後、いくつかの異なる動作が見られます。たとえば、Camel Routebuilders を作成し、configure() メソッドで、データベースからいくつかの構成を取得します。他のケースでは、setDataSource(..) メソッドを持つ Bean があり、ブループリントを介してそれにデータベース接続を注入し、その接続をバッ​​キング フィールドに格納した後、追加の (キャッシュされた) 初期化のために DB を呼び出します。 .

この領域では、Blueprint では例外が発生しますが、Spring-DM では例外が発生しませんでした。MySql Drive クラスが見つかりません。setDataSource(..) メソッドはプロキシ クラスを取得しますが、バッキング サービスは初期化されていません。このプロキシ クラスを呼び出すと、例外が発生し、バンドルの開始に失敗します。後でバンドルを手動で再起動すると、問題なく動作します。おそらく、依存関係が解決されたためです。

さて、長いイントロ。これがコードで行うことです。

deploy フォルダーには、jndi.xml というファイルがあり、これはその内容の一部です。

次に、OSGI-INF.blueprint フォルダー (リソース) に blueprint.xml の初期化を含む、maven でコンパイルされたバンドルがあり、次のフラグメントがあります。

これは、ServiceMix ログファイルに表示される例外です。

この問題が発生する 2 つのケースを確認しました。

  1. SomeClass のメソッド「setDataSource」がデータベースを呼び出すとき。
  2. SomeClass のメソッド「setDataSource」がデータソース値をプライベート バッキング フィールドに登録するだけで、SomeClass が (Camel) RouteBuilder であり、DB が configure() メソッドからアクセスされる場合。

上記のケース 1 でブレークポイントを設定しましたが、受け取った値は null ではありません。この null 以外の値はおそらく、ダンピング プロセスで使用されるリファレンス ダイナミズムに使用されるプロキシ クラスです。

スレッド A で実行されているバンドルは、Jdbc ドライバーへのプロキシを受け取り、データベースへの呼び出しを行いますが、Jdbc の初期化はスレッド B で行われ、スレッド B はまだ準備ができていません。バッキング サービスなしで何かを呼び出しています。ダンピング プロセスは、サービスの準備が整うまで、DB へのバンドル呼び出しをブロックする必要があるため、おそらくその領域で何か間違ったことをしているのでしょう。

上記の問題は複数のバンドルで発生し、システムによって動作が異なります。したがって、1 つを修正したと思われる場合は、別のものを介して再び表示されます。残念ながら、それはすべて非常に予測不可能です。

すでに試したことは次のとおりです。

  • バンドルの設計図には、DB 接続への「<参照」があり、参照リスナーを使用しました。動作する場合と動作しない場合があります。
  • プール 2 の maven-bundle-plugin セクションの下にある pom.xml の「import-packages」に依存関係を追加し、偶然これを見つけました。
  • 可能な限りどこでも、lazy-inits を使用しました。これは 100% 機能しますが、Camel Routebuilder の configure() メソッドには適用できません (これがいつ呼び出されるかはわかりません)。
  • バンドルの優先度を使用して、起動プロセスの早い段階で jndi.xml を初期化しました。インストールが自動化されているため、jndi.xml を非常に早い段階で、ServiceMix の他の何よりも先にインストールします。少しは役に立ちます。

私が試していないことは次のとおりです。-DBに保存された構成をローカルファイルに移動します-このリリースでは実行できませんが、将来のオプションです。- Spring-DM に戻します。面倒というより遅いほうがいい。ただし、これは私にとって実験的なものでもあります。私のマシンで(遅い)動作しているのを見てきました。他のマシンでも同じ問題が発生している可能性があります。また、この問題をServiceMixフォーラムに投稿しました(まだ回答が得られていません)が、Spring-DMに戻らないように「強く」アドバイスしています

JDBC ドライバーが完全に初期化されるまでバンドルが待機しない理由がよくわかりません。