conf/jboss-service.xmlその5

RMIのダイナミッククラスローディングを行うためのWebサーバ。待ち受けるURL、つまりRMIのコードベースはデフォルトでは 「http://<ホスト名>:8083」。デフォルトで受け付ける実装クラスはorg.jboss.web.WebService。といってもWebサーバとしての処理はすべてorg.jboss.web.WebServerのインスタンスに委譲している。org.jboss.web.WebServerは体裁としてはごく普通のHTTPサーバになっているが、リクエストを受け付けた後はクラスローディングに特化している。汎用じゃないならこのクラス名(WebService、WebServer)は良くないんじゃないかなー。


ところが実際にクライアントからJBossEJBをlookupしたところ、org.jboss.web.WebServerは使われていなかった…。
ダイナミックプロキシだからクラスローディングはいらないのか…?。むむむ、、、と思ったところでJBoss-srcのtestsuiteを調べることに気づいた。よし、org.jboss.test.jrmp.test.DynLoadingUnitTestCaseていうのがある。なるほど、EJB経由で知らないクラスのインスタンスが送られてきた場合にクラスローディングが発生するのか。


DynLoadingUnitTestCaseクラス内で

IString echo = bean.copy("jrmp-dl");

が実行されると、サーバ側では(TRACEレベルでログを出している)

 TRACE [org.jboss.web.WebServer] raw request=GET /org/jboss/test/jrmp/ejb/AString.class HTTP/1.1
 TRACE [org.jboss.web.WebServer] loaderKey = 
 TRACE [org.jboss.web.WebServer] filePath = rg/jboss/test/jrmp/ejb/AString.class
 TRACE [org.jboss.web.WebServer] No loader, reset filePath = org/jboss/test/jrmp/ejb/AString.class
 TRACE [org.jboss.web.WebServer] loader = org.jboss.mx.loading.UnifiedClassLoader3@2bc3f5{ url=file:/C:/jboss/jboss-4.0.2-src/build/output/jboss-4.0.2/server/default/tmp/deploy/tmp20456jboss-service.xml ,addedOrder=2}
 TRACE [org.jboss.web.WebServer] loading className = org.jboss.test.jrmp.ejb.AString
 TRACE [org.jboss.web.WebServer] clazzUrl = file:/C:/jboss/jboss-4.0.2-src/build/output/jboss-4.0.2/server/default/tmp/deploy/tmp20532jrmp-dl.jar
 TRACE [org.jboss.web.WebServer] new clazzUrl: jar:file:/C:/jboss/jboss-4.0.2-src/build/output/jboss-4.0.2/server/default/tmp/deploy/tmp20532jrmp-dl.jar!/org/jboss/test/jrmp/ejb/AString.class
 DEBUG [org.jboss.web.WebServer] Retrieving jar:file:/C:/jboss/jboss-4.0.2-src/build/output/jboss-4.0.2/server/default/tmp/deploy/tmp20532jrmp-dl.jar!/org/jboss/test/jrmp/ejb/AString.class
 TRACE [org.jboss.web.WebServer] HTTP code=200 OK, Content-Length: 625

のようにorg.jboss.web.WebServerが実行される。


EJBのときにどうやってるかは今後の宿題ということで。


RMI の使用による動的なコードのダウンロード
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/rmi/codebase.html


JavaHello World RMI
http://www.hellohiro.com/rmi.htm
RMI編もあったのか。なんでもHello Worldは大事ですね。