電子カルテクライアントが “沈黙” した原因と、接続成功までのすべて
本記事は、私が OpenDolphin(2.7系)を自前環境で構築するという目的で行った作業と、その過程で遭遇した“接続しないクライアント問題”を、最初から最後まで一切省略せずに記録した技術ログである。
「OpenDolphin を触るのが初めての人」
「評価版クライアントでハマった人」
「WildFly で動かしたい人」
そうした方々の参考になれば幸いである。
ただし、オープンソースである電子カルテ「OpenDolphin」は開発を終了している。現在は 株式会社メドレーが事業を承継し、開発・サポートを行っている
1. 作業開始:OpenDolphin を「まず動かす」ことを目標に設定
今回の PoC の目的はシンプルだった。
- OpenDolphin の仕組みを理解する
- 自前で構築したAWS上のWindowsServer2022に載せたい
- クライアントが自前サーバに接続する流れを確認したい
そのために、まずは OS 上に単純な構成を置いた。
使用環境
- Windows Server 2022(両方検証)
- Java(OpenJDK 8)
- WildFly
- PostgreSQL
- 評価版クライアント(2.7.1 とされる ZIPをGitHubからダウンロードした)
「公式手順」を参考にしながら、“できるだけ純粋な構成に近い状態” を作ることを意識した。
2. WildFly をインストールして起動する
2.1 まず WildFly を入手
ダウンロードサイト:https://adoptium.net/temurin/releases/?version=8
OpenDolphin 2.7 系で最も安定なのは WildFly 10 〜 11 です
2.2 配置
C:\WildFly\wildfly-26.1.3.Final
に展開。
2.2 起動
cd C:\WildFly\wildfly-26.1.3.Final\bin
standalone.bat
WildFly が 8080 で起動することを確認。
ここまでは順調。
3. PostgreSQL を準備する
今回の OpenDolphin は、内部的に PostgreSQL を想定している。すでに過去の電子カルテサーバでPostgresql8.4をインストールしていたため、そちらを使用した。
3.1 DB 作成
DB名 : dolphin
ユーザー名 : dolphin
パスワード : 任意
3.2 初期データ投入(最低限)
OpenDolphin の認証にはテーブルが必要。
デプロイが正常終了後に初期データを投入してください
INSERT INTO d_facility
INSERT INTO d_users
INSERT INTO d_roles
これで「サーバ側は動く状態」が整った。
3.3 Postgresql JDBCドライバ設定
①pgjdbc (PostgreSQL JDBC Driver) を入手
ダウンロードサイト:https://jdbc.postgresql.org/download/
PostgreSQL 8.4 なら JDBC Driver 42.x 系でも基本動作します。
②WildFly の module として配置
以下にディレクトリを作成:
C:\wildfly-10\modules\org\postgresql\main
配置するファイル:
postgresql-42.7.1.jarmodule.xml
③module.xml の作成
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.3" name="org.postgresql">
<resources>
<resource-root path="postgresql-42.7.3.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
※ resource-root path= のファイル名は、実際に置いた JAR 名に合わせてください。
④参照先DBの設定(WildFlyのStandalone.xmlにDataSource設定)
C:\wildfly-10\standalone\configuration\standalone.xml を編集します。
■ <drivers> の中に JDBC ドライバ登録
<driver name="postgresql" module="org.postgresql">
<driver-class>org.postgresql.Driver</driver-class>
</driver>
■ <datasources> に DataSource を追加
<datasource jndi-name="java:/jdbc/dolphinDS" pool-name="dolphinDS">
<connection-url>jdbc:postgresql://localhost:5433/dolphin</connection-url>
<driver-class>org.postgresql.Driver</driver-class>
<driver>postgresql</driver>
<security>
<user-name>dolphin</user-name>
<password>*****</password>
</security>
</datasource>
⑤WildFly を再起動して DataSource をテスト
standalone.batを起動して、エラーが出ていないことを確認します。エラーがある場合は、Postgresqlドライバが認識されていないか、Standalone.xmlの記述に誤りがある状態です。
4. dolphin.war の配置とデプロイ
GitHubからOpenDolphinをCloneしOpenDolphinのサーバファイル(warファイル)をBuildします。Buildしたwarファイルを、わかりやすい名前(例:dolphin.war)に変更して、WildFly のdeployments へコピー。
C:\WildFly\wildfly-26.1.3.Final\standalone\deployments\
その後、WildFlyを再起動すると、.deployed ファイル生成 され、WildFly ログで “Deployed dolphin.war” が確認できるれば、サーバ側の起動は問題なし。もし、deployファイルが作成されていない場合は、deployファイルが作成されるまでトラブルシューティングしてください
自分自身が経験したBuildエラートラブルです
①postgresql-9.2-1002.jdbc4.jarをext_libにコピーして再Build
理由:OpenDolphinのソースがPostgresql9.2のJDBCを参照していたため
こちらでいったんBuildは正常
このあと、デプロイしてもfailedだけが作成し続け、deployedを作成するまで苦労しました
②OpenDolphinが期待しているDataSource名ではない
以下のようにPostgresDSというDataSourceを追加した
<datasources>
<!-- 既存の ExampleDS は残しておいて構いません -->
<datasource jndi-name="java:jboss/datasources/PostgresDS"
pool-name="PostgresDS"
enabled="true"
use-java-context="true">
<connection-url>jdbc:postgresql://localhost:5433/dolphin</connection-url>
<driver>postgresql</driver>
<security>
<user-name>dolphin</user-name>
<password>*****</password>
</security>
</datasource>
<drivers>
<driver name="h2" module="com.h2database.h2">
<xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
</driver>
<driver name="postgresql" module="org.postgresql">
<driver-class>org.postgresql.Driver</driver-class>
</driver>
</drivers>
</datasources>
③Standalone.xml内のJPA のデフォルトデータソースが 空(“”) だった
<subsystem xmlns="urn:jboss:domain:jpa:1.1">
<jpa default-datasource="java:jboss/datasources/PostgresDS"
default-extended-persistence-inheritance="DEEP"/>
</subsystem>
④ClassNotFoundException
failedの中を確認すると、ClassNotFoundException: Could not load requested class : org.hibernate.type.StringClobTypeというエラーが出ていた
OpenDolphinのソースを全検索して
@Type(type=”org.hibernate.type.StringClobType”)
の行を
@Type(type=”org.hibernate.type.StringType”)
に変更して再Build、再デプロイ
⑤NullPointer Exceptionエラー
failedの中を確認すると、jboss.deployment.unit.”opendolphin-server-2.7.1.war”.component.PvtService.START … EJBException: NullPointerExceptionというエラーが出ていた
解決として、
C:\wildfly-10.1.0.Final\custom.properties
というテキストファイルを作成します。
最低限、ファイルの中身には、
# OpenDolphin basic settings
# 医療機関ID(DBに入れる予定の facilityId と合わせる想定)
dolphin.facilityId=1.3.6.1.4.1.9414.70.1
# ORCA連携用(今はダミーでOK)
claim.host=localhost
claim.port=8000
claim.user=ormaster
claim.password=ormaster
# ログレベルなど(あってもなくてもよいが、一応)
dolphin.logLevel=WARN
と記述します
standalone.xml の <subsystem xmlns="urn:jboss:domain:logging:…"> の中には、以下の内容を記述しておきます(念のため)
<logger category="open.dolphin">
<level name="WARN"/>
</logger>
<logger category="dolphin.claim">
<level name="WARN"/>
</logger>
この後、再デプロイして確認します
こちらを行って、サーバは正常起動しました
5. ここからさらに問題発生:クライアントが“完全に沈黙”
5.1 初期データをDBに投入
この時点で、OpenDolphinのテーブルは作成されているはずです。クライアント接続に必要な認証データを投入してください
5.2 クライアントアプリを作成する
サーバアプリをBuildしたように、OpenDolphinのソースからクライアントアプリケーションをBuildします
5.3 クライアントアプリを実行する
コマンドラインから
java -jar OpenDolphi
しかし、トラブル発生。ログイン画面が出る。しかし・・
- WildFly には 1 つもリクエストが来ない
- PostgreSQL 側にもクエリが飛ばない
- クライアントには「接続できない」というエラーすら出ない
- ログインしても無反応(沈黙)
この時点で、サーバ側が悪いのか、クライアント側が悪いのか、判断がつかない。
6. 切り分け開始:「サーバは問題ない」ことを確認
まずサーバ側を確認した。
dolphin.warは正しく起動- WildFly ログには deploy エラーなし
- PostgreSQL も正常に接続可能
- DB 初期データも投入済み
つまり サーバ側は正常。
ではなぜ接続が来ない?
7. 次の仮説:
「クライアントは接続先 URL が固定されているのでは?」
ここで、OpenDolphin は接続先サーバが固定されているのでは?と疑い始める。
実際、世の中には
- クラウド用に URL を固定したビルド
- 体験版として接続先変更不可のもの
が存在する。
このOpenDolphinクライアントも、その可能性が十分ある、と思った
8. 設定画面を開く → 一見変更できそうだが、保存されない
クライアント右下の [設定] を開いたところ、
「サーバ」「スキーマ」「ポート」といった項目が並んでいた。
しかもサーバの項目は、test.open.dolphinがデフォルト
設定変更できる雰囲気がある。
ところが:
http://localhost:8080と入力 → 保存 → 値が消えているhttp://192.168.10.5:8080→ 保存 → 消える/dolphinを書いてみる → 保存 → 消えるlocalhostを書いてみる → 保存 → 消える127.0.0.1を書いてみる → 保存 → 消える
これは、設定項目が「見せかけ」で実際には固定 URL に接続しているのでは?
という疑惑が深まっていく。
ここでしばらく時間を消費した。
9. hosts ファイルで出口を書き換える案(緊急回避策)
万が一、本当に URL が固定なら、
C:\Windows\System32\drivers\etc\hosts
で名前解決を書き換えれば、
強制的に自前サーバへ誘導できる。
しかし、
- 固定 URL かどうかの確証がない
- これは「根本解決ではない」
ため、一時保留とした。
10. さらに試行錯誤:クライアントを自前ビルドする案
GitHub 上の OpenDolphin 2.7m(猪俣先生開発版?)のソースを clone し、クライアントだけ自前ビルドして差し替える案も検討した。本来、サーバもBuildしなおす必要があるかもしれないが、時間を割きたくないのでいったんクライアントだけ。
11. 決定的瞬間:
すると、サーバの設定ができた共に、正しい設定の仕方が偶然わかった
設定画面をもう一度よく見ると、
項目は次のように分かれている。
| 項目 | 入れるもの |
|---|---|
| スキーマ | http / https |
| サーバ | ホスト名または IP だけ |
| ポート | 数字だけ(例:8080) |
ここで気づいた。
サーバ欄に “http://” や “:8080” を入れてはいけない。
純粋なホスト名だけを書く仕様だった。
つまり、正しい入力はこう:
正しい例
スキーマ:http
サーバ:127.0.0.1
ポート:8080
正しくない例(保存されず消える)
サーバ:http://localhost:8080
サーバ:localhost:8080
サーバ:http://192.168.x.x/dolphin
これがすべての原因だった。
12. 正しく設定して保存 → 接続成功!
サーバ欄を 127.0.0.1のみにし、
ポート欄に 8080 を入力して保存。
期待半分、不安半分でログインボタンを押す。
WildFly ログを見ると──
POST /dolphin/login
200 OK
来た。初めてクライアントが喋った。
沈黙状態が続いていたOpenDolphinクライアントが、ようやく自前サーバに接続を開始した。
結局、当初BuildしていたOpenDolphinのソースは、サーバをDockerで構築する簡易版だったのかもしれない(推測)
OpenDolphin 2.7mでBuildしたクライアントアプリで電子カルテを操作してみようと思う。もしかしたら、サーバも再構築する必要があるかもしれないが、問題があった時に対応するつもり。
13. hosts の修正は不要に
hosts 書き換え案は不要となり、即座に元に戻した。
14. clone した OpenDolphin ソースの扱い
clone していたソースは、
- WildFly に影響なし
- クライアント実行にも影響なし
- 今後ビルドするなら Work に移動すればよい
- 使わないなら削除して OK
という結論に達した。
15. 結果:
この環境で OpenDolphin は問題なく動作する
サーバ:WildFly
DB:PostgreSQL
という構成で、OpenDolphin の認証と画面まで通った。
「クライアントは URL 固定されている」という疑いは誤りで、
真の原因は 設定画面の入力仕様の誤解 だった。
16. 今回の学び(技術的教訓)
- OpenDolphin クライアントの設定項目は“URL”ではなく“サーバ名””IPアドレス”を入れる欄である。
- プロトコル(http)とポート(8080)は別欄で指定する。
- WildFly 側が正常でも、クライアントが正しく設定されていなければ完全沈黙する。
- hosts 書き換え案は“最終手段”であり、本質的な解決ではなかった。
- 結局のところOpenDolphin 2.7mでクライアントは再Buildしただけで、いったんはサーバ再構築は不要でした。ただ、設定の仕方が問題の核心であることもわかりました。