Webアプリケーションにstruts2を使用していますが、サービスとdaoレイヤーにosgiアーキテクチャを使用したいと考えています。ここで、struts2アクションをosgiバンドルとしてラップしたくはありませんが、サービスとdaoレイヤーをバンドルとしてパッケージ化する必要があります。これで、osgi以外のアクションがosgiバンドル(サービスおよびdaoレイヤー)をどのように消費するかを誰かに教えてもらえますか?そして、struts2 WebアプリケーションをWebコンテナーにデプロイして、この場合、Webコンテナーがosgiコンテナー(サービスとdaoがデプロイされている場所)とどのように相互作用するかを知りたいと思います。助けてください 。
2 に答える
Web コンテナと OSGi 環境の間にいわゆる「ブリッジ」が必要です。Felix と Equinox の両方にその機能がありますが、私にとっては Felix の実装の方がはるかにうまく機能しました。
基本的にやりたいことは次のとおりです。
- ServletContext にコンテキスト リスナーを追加する
- ServletContext の起動時に OSGi を起動し、ServletContext が破棄されたら停止します。
- サービスとして登録することにより、ServletContext を OSGi コンテキストに渡します。
- OSGi フレームワーク オブジェクトを属性として登録して、ServletContext に格納します。
OSGi から Web コンテキストにアクセスするには: ServletContext サービスを取得し、そこから移動します。
Webcontext から OSGi にアクセスするには: ServletContext 属性から OSGi フレームワークを取得し、そこから移動します。
Felix Documentationを確認してください。また、 GitHubでしばらく前に例を作成しました
ほとんどの場合、これは機能しません。アプリケーションの半分を OSGi に移行するのが良い考えだと思うのはなぜですか? すべてを移動するか、まったく移動しないかのどちらかです。
struts レイヤーを war ファイルにデプロイし、そこから OSGi サービスにアクセスできる場合があります。これは Virgo と Apache Karaf で可能だと思います。それは、OSGi 構造との戦争を強化することを意味します。たとえば、Karaf では、マニフェストを含む war ファイルである wab ファイルを使用できます。