これまでは、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
<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がカウンタを引き上げたからです)。