Windows 上で JBoss EAP を稼働させる際に少し気をつけた方が良いこと
別に JBoss EAP だけの注意点ではないのですが、Windows 環境では稼働しているプログラムが利用しているファイルに対してロックが掛かってしまい、ロックが掛かっている間はファイルの移動/削除などができなくなりますが、Windows 上で JBoss EAP を稼働させる場合も一度 JBoss EAP に読込まれた jar ファイルなどにロックが掛かってしまうため、JBoss EAP が稼働したまま定義を削除するような場合に期待した動作とならない場合があります。
(記憶が曖昧ではありますが、この辺りの話は Oracle WebLogic Server でも同様かなと思います)
上記のような注意点が分かり易いように以下のような JBoss EAP へ JDBCドライバを登録し、直ぐに削除する検証を実施してみました。
- 準備作業
- JBoss EAP の起動
- JDBC ドライバの登録
- 検証1:JBoss EAP が稼働したまま JDBC ドライバを削除
- 検証2:JBoss EAP を停止後に JDBC ドライバを削除
- まとめ
準備作業
- 以下のページから PostgreSQL JDBC ドライバをダウンロードします。
JBoss EAP の起動
set JBOSS_HOME=C:\opt\jboss-eap-7.4.6
%JBOSS_HOME%\bin\standalone.bat
%JBOSS_HOME%\bin\jboss-cli.bat -c
[standalone@localhost:9990 /]
JDBC ドライバの登録
- 現在登録されている JDBC ドライバを確認します。
[standalone@localhost:9990 /] jdbc-driver-info
NAME SOURCE
h2 com.h2database.h2/main
[standalone@localhost:9990 /]
- PostgreSQL の JDBC ドライバをコアモジュールとして導入します。
[standalone@localhost:9990 /] module add --name=org.postgresql --resources="<ダウンロードフォルダ>\postgresql-42.5.0.jar" --dependencies=javax.api,javax.transaction.api
[standalone@localhost:9990 /]
- PostgreSQL の JDBC ドライバを登録します。
[standalone@localhost:9990 /] /subsystem=datasources/jdbc-driver=postgresql:add(driver-name=postgresql,driver-module-name=org.postgresql,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)
{"outcome" => "success"}
[standalone@localhost:9990 /]
- 現在登録されている JDBC ドライバを再度確認します。
[standalone@localhost:9990 /] jdbc-driver-info
NAME SOURCE
h2 com.h2database.h2/main
postgresql org.postgresql/main <= *** JDBC ドライバを登録すると jdbc-driver-info の結果に現れるようになります ***
[standalone@localhost:9990 /]
- jar ファイルが modules フォルダへコピーされていることを確認します。
dir <<JBOSS_HOME>>\modules\org\postgresql\main\postgresql-42.5.0.jar
ドライブ C のボリューム ラベルは Windows-SSD です
ボリューム シリアル番号は xxxx-xxxx です
C:\opt\jboss-eap-7.4.6\modules\org\postgresql\main のディレクトリ
2022/09/28 19:33 1,046,274 postgresql-42.5.0.jar
1 個のファイル 1,046,274 バイト
0 個のディレクトリ 132,541,067,264 バイトの空き領域
検証1:JBoss EAP が稼働したまま JDBC ドライバを削除
[standalone@localhost:9990 /] jdbc-driver-info
NAME SOURCE
h2 com.h2database.h2/main
postgresql org.postgresql/main
[standalone@localhost:9990 /]
[standalone@localhost:9990 /] /subsystem=datasources/jdbc-driver=postgresql:remove() <= *** JDBC ドライバを削除 ***
{"outcome" => "success"}
[standalone@localhost:9990 /] jdbc-driver-info
NAME SOURCE
h2 com.h2database.h2/main
[standalone@localhost:9990 /] module remove --name=org.postgresql <= *** コアモジュールを削除 ***
Failed to delete <<JBOSS_HOME>>\modules\org\postgresql\main\postgresql-42.5.0.jar <= *** JBoss EAP プロセスが jar ファイルをロックしているためモジュールが削除できない ***
[standalone@localhost:9990 /]
(補足)この時、<<JBOSS_HOME>>\modules\org\postgresql\main\postgresql-42.5.0.jar ファイルが残っていて、直接 postgresql-42.5.0.jar ファイルを手動で削除しようとすると Java プロセスが掴んでいることが確認できます。
検証2:JBoss EAP を停止後に JDBC ドライバを削除
- 再度、JDBC ドライバを削除すると期待通り動作します。
[standalone@localhost:9990 /] module remove --name=org.postgresql <= *** JBoss EAP 停止後ならモジュールが削除可能 ***
[standalone@localhost:9990 /]
(補足)このタイミングで <<JBOSS_HOME>>\modules\org\postgresql\main\postgresql-42.5.0.jar が存在しないことが確認できます。
まとめ
Windows 環境で稼働している JBoss EAP が読み込んだファイルに対してロックが掛かってしまうことと、JBoss EAP プロセスを停止すればロックが解放されるため、期待通りの操作が可能なことが確認できました。 Windows 環境で JBoss EAP の挙動が変に感じた際は一度この辺りを意識して調査してみると良いかも知れません。