CLOVER🍀

That was when it all began.

OSGi Bundleのバージョン管理を確認する

これまでは、Web層のOSGi BundleとService層のOSGi Bundleを作成して、連携するところまで確認してみました。が、これだとOSGi周りの内容が付属して面倒になったSpringアプリケーション以外の何者でもないので、OSGiの利点を確認するためにバージョン管理の機能を利用してみましょう。

つまり、前に作成したOSGi Bundleの別バージョンを作って遊んでみるってことですね♪以下のような状態になることを目指します。

Web Bundle[Ver1.0] ------------> Service Bundle[Ver1.0]
                         |  
Web Bundle[Ver1.1] ------|

まずはWebから。前のプロジェクトをコピーして、バージョン1.1を作成します。

$ cp -R my-web-bundle my-web-bundle1.1

STSにインポートして、pom.xmlを修正。

  <modelVersion>4.0.0</modelVersion>
  <groupId>my.web.bundle</groupId>
  <artifactId>my-web-bundle</artifactId>
  <packaging>war</packaging>
  <version>1.1.0</version>
  <name>my-web-bundle Maven Webapp</name>
  <url>http://maven.apache.org</url>

MANIFEST.MF

Manifest-Version: 1.0
Bundle-SymbolicName: my.web.bundle
Bundle-Version: 1.1.0
Bundle-Name: My Web Bundle
Web-ContextPath: my-web-bundle11
Import-Library: org.springframework.spring;version="[3.0,3.1)"
Import-Bundle: com.springsource.org.apache.taglibs.standard;version="[
 1.1.2,1.3)"
Import-Package: my.service.bundle;version="[1.0,2.0)",
 org.eclipse.virgo.web.dm;version="[2.0.0,3.0.0)",
 org.springframework.beans.factory.annotation;version="[3.0,3.1)",
 org.springframework.core.io;version="[3.0,3.1)",
 org.springframework.stereotype;version="[3.0,3.1)",
 org.springframework.web.bind.annotation;version="[3.0,3.1)",
 org.springframework.web.context;version="[3.0,3.1)",
 org.springframework.web.servlet;version="[3.0,3.1)",
 org.springframework.web.servlet.mvc.annotation;version="[3.0,3.1)"

「Bundle-Version」と「Web-ContextPath」を変更していることがポイントです。「Web-ContextPath」を変えないと、Webアプリケーションのコンテキストパスが被ってしまいますからね…。

ここまでで1.1になるんですけど、わかりやすくするためにJSPをちょっと修正。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<html>
<body>
<h2>Hello Ver1.1 myCount:${fn:escapeXml(myCount)} Service[Version:${fn:escapeXml(version)}, count:${fn:escapeXml(count)}]</h2>
</body>
</html>

バージョン1.0も、一応変えておきます。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<html>
<body>
<h2>Hello Ver1.0 myCount:${fn:escapeXml(myCount)} Service[Version:${fn:escapeXml(version)}, count:${fn:escapeXml(count)}]</h2>
</body>
</html>

では、まずバージョン1.0の方を確認してみます。

動いてますね。

続いて、STSのVirgo Web Serverに、先ほど作成したOSGi Web Bundleの1.1を追加してみます。Virgo Web Serverを右クリックして、「Add and Remove」で追加してくださいね。追加がうまくいくと、Admin Consoleで確認できます。

では、動作確認してみましょう。以下のURLへアクセスしてみます。
http://localhost:8080/my-web-bundle11/hello/index

ちゃんと表示されましたね。

なお、ここで初回アクセスなのに「Service[Version:1.0, count:2]」と、いきなりServiceのcountが2になっているところがポイントです。Service層のコンポーネントはSingletonなので、バージョン1.0のOSGi Web Bundleが使っているコンポーネントと同じインスタンスを共有していることになります。

よって、バージョン1.0の方にアクセスすると、ControllerのカウンタとServiceのカウンタが合わなくなります(バージョン1.1のOSGi Web Bundleがカウンタを引き上げたからです)。