- PR -

JBOSSのホットデプロイ機能について【解決】

1
投稿者投稿内容
vash
会議室デビュー日: 2004/12/10
投稿数: 6
投稿日時: 2004-12-10 11:30
jboss3.2.6にてホットデプロイ機能が効きません。

開発環境
  • jboss3.2.6(3.2.3でも同様の事象が発生します)
  • j2sdk1.4.2
  • eclipse3.0.1gtk
  • vine linux 2.6

セッションステートレスビーンを作成して確認しました。

コード:

/**
* @ejb.bean name="Hello"
* jndi-name="Hello"
* type="Stateless"
* transaction-type="Container"
*/
public abstract class HelloBean implements SessionBean {
/**
* @ejb.interface-method view-type="remote"
*/
public String getMessage(String msg) {
msg += " version 1";
System.out.println(msg);
return msg;
}
}



引用:
msg += " version 1";


この部分を" version 2", "version 3", ... と変更してhelloEJB.jarを
その都度 $JBOSS_HOME/server/defalut/deployにコピーすると
JBOSSのコンソールに下記のリロード完了メッセージが表示されて
リロードされた事が確認できるのですが
コード:

02:13:46,249 INFO [EjbModule] Undeployed: Hello
02:13:46,474 INFO [EjbModule] Deploying Hello
02:13:46,559 INFO [EJBDeployer] Deployed: file:/opt/jboss-3.2.6/server/default/deploy/helloEJB.jar


テスト用クライアントからEJBのメソッドを呼び出す(getMessage("hello")と
ソースコードの修正結果が反映されませんでした。

コード:
1回目のJBOSSコンソール

02:13:59,816 INFO [STDOUT] hello version 1

2回目のJBOSSコンソール(version2のhelloEJB.jarをデプロイ後にテスト実行)
02:14:53,364 INFO [STDOUT] hello version 1

3回目のJBOSSコンソール(version3のhelloEJB.jarをデプロイ後にテスト実行)
02:15:24,128 INFO [STDOUT] hello version 1


念のため
$JBOSS_HOME/server/defalut/deploy/helloEJB.jarと
$JBOSS_HOME/server/default/tmp/deploy/tmp*helloEJB.jarから
HelloBean.classを解凍してバイナリエディタで"version"文字列を
確認して、2回目の.classには"version 2"が、3回目の.classには
"version 3"が存在することを確認しました。
当然JBOSSを再起動するとソースコードの修正結果が正しく反映されます。

この結果から疑問が湧くのですが
" version 1"が埋め込まれているHelloBean.classを含んでいるhelloEJB.jarが
どこにも存在していないんですよね。
メモリ上にロードされたhelloEJB.jarで動き続けているということでしょうか?
コンソールのリロード完了メッセージは間違っているのでしょうか?

JBOSSはjboss-3.2.6.tar.bz2を解凍しただけで設定等は何も行っていません。
テストはeclipse上から行ってもコマンドライン上から行っても同じ結果になります。

EJBのホットデプロイが魅力でJBOSSをインストールしたので、なんとか再起動
しないでデプロイできるようにしたいです。

_________________


[ メッセージ編集済み 編集者: vash 編集日時 2004-12-10 15:26 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-10 11:38
当該クラスがシステムクラスパスに通っているということはないでしょうか?
システムクラスパスに通っているクラスはアンロードできませんので再デプロイしても変更内容は反映されません。
起動スクリプトを確認してみましょう。

>EJBのホットデプロイが魅力でJBOSSをインストールしたので、なんとか再起動
ホットデプロイは今時のサーバならどれでも出来ると思いますよ。
日本語マニュアルやサポートの充実している WebSphere や WebLogic も視野にいれてみる価値はあるとおもいます。
vash
会議室デビュー日: 2004/12/10
投稿数: 6
投稿日時: 2004-12-10 11:59
インギさん、レスありがとうございます。

システムクラスパスは空になっています。
$ echo $CLASSPATH

JBOSSのrun.shの中身も確認しましたが、$JBOSS_HOME/server/default/deploy/には
クラスパスは通っていませんでした。# 当たり前ですが

_________________
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-10 13:55
うーん、なんででしょうね。
jer/lib/EXT 以下にクラスがおいてあるって事はないですよね?
vash
会議室デビュー日: 2004/12/10
投稿数: 6
投稿日時: 2004-12-10 14:36
引用:
jer/lib/EXT 以下にクラスがおいてあるって事はないですよね?



なかったです。念のためjar tvf で各jarの中身もチェックしました。

コード:
$ ls -al $JAVA_HOME/jre/lib/ext
合計 948
drwxr-xr-x    2 root     root         4096 Sep 23  2003 ./
drwxr-xr-x   14 root     root         4096 Dec  7 14:35 ../
-rw-r--r--    1 root     root         8893 Jun 20  2003 dnsns.jar
-rw-r--r--    1 root     root        53244 Jun 20  2003 ldapsec.jar
-rw-r--r--    1 root     root       769332 Sep 16  2003 localedata.jar
-r--r--r--    1 root     root       111374 Jun 20  2003 sunjce_provider.jar



ぐーぐる等で「JBOSS ホットデプロイ」で検索してますが
なかなか欲しい情報がヒットしません。
ふつうはハマる所じゃないんでしょうね。トホホ
vash
会議室デビュー日: 2004/12/10
投稿数: 6
投稿日時: 2004-12-10 15:12
インギさん解決しましたー!やっぱり私のポカミスでした。

引用:
この結果から疑問が湧くのですが
" version 1"が埋め込まれているHelloBean.classを含んでいるhelloEJB.jarが
どこにも存在していないんですよね。



これが微妙に間違ってました。
helloEJB.jarの動作確認用に作成したhelloWEB.jarなる隠し球がありまして
それのWEB-INF/classesにHelloBean.classが存在していました。

再デプロイしているのはhelloEJB.jarなので、追跡する時にhelloEJB.jarばかりに
目が行ってましたが、
http://waimangu.typepad.com/living_in_nz/java/
上記の「April 23, 2004 JBossのクラスローダー」の

引用:
デフォルトのJBossの設定では、ロードされたクラスは共通のクラスリポジトリーに入れられます。そしてクラスリポジトリーの中のクラスは、どのデプロイメント単位からも見えるのです。



上記のコメントを読んで「もしや!」と気づきました。
helloWEB.jarをアンデプロイしてやれば、helloEJB.jarのホットデプロイ効きまくりです。

お騒がせしてすみませんでした。アドバイスありがとうございました。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-10 15:35
おめでとうございます!
やはりデプロイメント関連のトラブルシューティングにはその AP サーバのクラスローダの構造を把握するのが重要ですね。
1

スキルアップ/キャリアアップ(JOB@IT)