Windows 上で JBoss EAP を稼働させる際に少し気をつけた方が良いこと

別に JBoss EAP だけの注意点ではないのですが、Windows 環境では稼働しているプログラムが利用しているファイルに対してロックが掛かってしまい、ロックが掛かっている間はファイルの移動/削除などができなくなりますが、Windows 上で JBoss EAP を稼働させる場合も一度 JBoss EAP に読込まれた jar ファイルなどにロックが掛かってしまうため、JBoss EAP が稼働したまま定義を削除するような場合に期待した動作とならない場合があります。


(記憶が曖昧ではありますが、この辺りの話は Oracle WebLogic Server でも同様かなと思います)

上記のような注意点が分かり易いように以下のような JBoss EAPJDBCドライバを登録し、直ぐに削除する検証を実施してみました。


準備作業

  • 以下のページから PostgreSQL JDBC ドライバをダウンロードします。

jdbc.postgresql.org


JBoss EAP の起動

  • 以下のような感じで JBoss EAP を起動します。(環境に応じて適宜読み替えてください)
set JBOSS_HOME=C:\opt\jboss-eap-7.4.6

%JBOSS_HOME%\bin\standalone.bat


  • 管理 CLI を起動し JBoss EAP へ接続します。
%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 /]


  • PostgreSQLJDBC ドライバをコアモジュールとして導入します。
[standalone@localhost:9990 /] module add --name=org.postgresql --resources="<ダウンロードフォルダ>\postgresql-42.5.0.jar" --dependencies=javax.api,javax.transaction.api
[standalone@localhost:9990 /]


[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 ドライバを削除

  • JBoss EAP が稼働した状態だと jar ファイルがロックされた状態となり削除できないことを確認します。
[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 ドライバを削除

  • ここで一度 JBoss EAP を停止します。


  • 再度、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 の挙動が変に感じた際は一度この辺りを意識して調査してみると良いかも知れません。