« 2026年2月 | トップページ

2026年9月

2026年9月21日 (月)

orca websocket 再接続

当院の OpenDolphin は、受付情報を orca から push api を使って dolphin に送っている。ただ、1つ何とかしなければと思っていたことがあって、それは orca のシステムアップデートへの対応であった。orca でシステムアップデートをすると、orca がリスタートして、その時 push api のクライアント接続を切ってしまうのである。これまでは、アップデートがあったら dolphin を再起動して対応していたのであるが、再起動を忘れてしまって、受付情報が送られないというクレームが受付から寄せられる案件が2回ほどあった。

今回 wildfly 更新に合わせて、orca から接続を切られたら、その onClose を検出して、再接続する仕組みを加えた。

2026年9月20日 (日)

java.util.Date との決別


Javaにおける日付・時刻APIの歴史は、設計の失敗と、それを乗り越えるための試行錯誤の歴史である (by ChatGPT)

Java の日時処理は、C言語の時刻APIの影響を色濃く受けた java.util.Date から始まった。その後、より柔軟に扱うための抽象クラス Calendar が登場し、その代表的な実装として GregorianCalendar が使われるようになった。自分が OpenDolphin をいじり始めたのは Java 1.5 時代であり、日時はこれらのAPIで扱っていた。しかし、このAPIには月が 0 から始まるという強力な罠があった。

new GregorianCalendar(2026, 8, 17) // 2026年9月17日

そして歴史は進み、ついに Java 8 で JSR 310 として java.time が導入された。用途ごとに明確な型が用意され、基本的にイミュータブルである。日付・時刻処理を、ようやく安心して書ける時代が来た。

とはいえ、うちの OpenDolphin での JSR 310 への移行は、そう簡単なものではなかった。Date、GregorianCalendar、java.time が複雑に同居、さらに infomodel には、イベントを保持できる独自の日付システムである SimpleDate もある。変換処理はあちこちに散在しており、下手に直せば日時の境界条件で壊れかねない。まさに恐ろしい混沌であり、これまでは見て見ないふりをしてやり過ごしてきた。

それでも今回、意を決して java.time(JSR 310)へ統一するリファクタリングを決行した。

使用箇所は想像以上に多かった。引数、戻り値、DBとの変換、画面表示、テストデータまで、日付はアプリケーションのあらゆる場所に入り込んでいる。型が違えばコンパイルエラーで止まるため、そこを手がかりに一つずつ型を書き換え、移行を進めていった。

最後までしぶとく残ったのが、month + 1 問題である。Calendar の月は0始まりなので、実際の月にあわせるために、+ 1 や - 1 が、随所に入り込んでいた。これはコンパイルエラーでは検出できないため、厄介だった。そして、受診日検索に残っていた最後の1個を退治したとき、ようやくすべての日付処理を JSR 310 へ統一できた。

結構な手間であったのだが、機能が追加されたわけではなく、使っていて意識されるところははない。しかし、今後の日付処理を安心して変更できる土台ができたことは大きい。もう月の値を見て、「これ、0始まりだっけ?」と身構えずに済むようになった。

2026年9月18日 (金)

OpenDolphin: Java 25 / WildFly 41 への移行

これまで wildfly 38 で運用していたが、wildfly 41 への移行した。Java は 25 のままで変更なし。

wildfly 41 の準備

wildfly の github から branch 41.x を選択,"Download Zip" して解凍する。作業時点ではこれで 41.0.1.Final がダウンロードされた。

mac で wildfly 41 のビルド

brew をアップデートして mvn と ant を最新にしておく。

$ brew update ; brew upgrade

wildfly の build

$ mvn install
[INFO] Scanning for projects...
Downloading from central: https://repo.maven.apache.org/maven2/org/jboss/jboss-parent/51/jboss-parent-51.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/jboss/jboss-parent/51/jboss-parent-51.pom (104 kB at 402 kB/s)
Downloading from jboss-public-repository-group: https://repository.jboss.org/nexus/repository/public/io/netty/netty-bom/4.1.137.Final/netty-bom-4.1.137.Final.pom
Downloading from central: https://repo.maven.apache.org/maven2/io/netty/netty-bom/4.1.137.Final/netty-bom-4.1.137.Final.pom
 :
 :
[INFO] WildFly Preview: Thin Server Build ................. SUCCESS [ 16.390 s]
[INFO] WildFly Preview: Distribution ...................... SUCCESS [ 18.334 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  28:15 min
[INFO] Finished at: 2026-08-25T15:14:58+09:00
[INFO] ------------------------------------------------------------------------

これで wildfly-41.0.1.Final-SNAPSHOT ができる。full distributable build が欲しい場合は, build/target ではなく, dist/target の方を使う必要がある。

wildfly 41.0.1 のセットアップ

  • ./standalone.sh -b 0.0.0.0 で立ち上げて,./add-user.sh で管理ユーザ登録
  • JDBC の登録(ドライバは postgresql-42.7.13.jar),data-source の作成,パスワード登録。
    $ ./jboss-cli.sh --connect
    [standalone@localhost:9990 /] module add --name=org.postgres --resources=~/Downloads/postgresql-42.7.8.jar --dependencies=javax.api,javax.transaction.api
    [standalone@localhost:9990 /] /subsystem=datasources/jdbc-driver=postgres:add(driver-name="postgres",driver-module-name="org.postgres",driver-class-name=org.postgresql.Driver)
    [standalone@localhost:9990 /] data-source add --jndi-name=java:jboss/datasources/DolphinDS --name=DolphinDS --connection-url=jdbc:postgresql://localhost/dolphin --driver-name=postgres --user-name=dolphin
    [standalone@localhost:9990 /] /subsystem=datasources/data-source=DolphinDS:write-attribute(name=password, value=dolphin)
    [standalone@localhost:9990 /] quit
    

ライブラリのアップデート

WildFly 41 に合わせて、ライブラリをアップデートする。

  • Hibernate 7.4.5.Final
  • Hibernate Search 8.4.0.Final
  • Resteasy 7.0.3.Final
  • Jackson 2.22.2
  • Jackson annotations 2.22
  • Postgresql 42.7.13

書き換え内容

  • websocket のタイムアウト抑止
    standalone.xml
    <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true" read-timeout="0" write-timeout="0"/>
    
  • @SequenceGenerator に allocationSizeを指定していない場合、Hibernate はデフォルトで allocationSize=50 を使い、DB側のシーケンスのINCREMENT BYもその値(またはエンティティごとの設定値)に合わせて作成・更新しようとする。Hibernate 6 までは、この不一致をよきに計らってくれていたようだが、7 にしたところ エラーで止まってしまうようになった。
    ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 84) MSC000001: Failed to start
     :
    Caused by: org.hibernate.MappingException: The increment size of the [hibernate_sequence] sequence is set to [50] in the entity mapping but the mapped database sequence increment size is [1]
    
    当院ではずっと @GeneratedValue(strategy = GenerationType.AUTO) のまま使ってきたのであるが、遂に手を付けねばならない潮時がきたようだ。infomodel 全てから extend されている InfoModel というクラスがあったので、そこに sequenceName = hibernate_sequence, allocationSize = 1 の @SequenceGenerator をに設定し、@GeneratedValue にこの generator をセットするように書き換えた。
  • Hibernate 6 へ移行したときに、masuda 先生の ModuleModelBridge.java が動かなくなってしまって、怪しい workaround をしていた。Hibernate 5 で動いていた ModuleModelBridge の byte[] が、Hibernate 6 で byte と判定されていたのは、フィールドが byte[] だと、自動的に byte にばらして呼ばれるような仕様になっていたようだ。最新の masuda 先生のソースでは、ModuleModel ではなく、DocumentModel に DocumentRoutingBinder を付けてインデックスを作るようになっていたので、パクらせてもらった。

Opensearch インストール

  • ダウンロードサイトから tarball を取ってくる
    $ tar xvzf opensearch-3.8.0-linux-x64
    $ ln -s opensearch-3.8.0 opensearch
    
  • 初期インストールのプラグインは全部消す
    $ cd opensearch
    $ rm -rf plugins/*
    
  • プラグインインストール
    $ ./bin/opensearch-plugin install analysis-kuromoji
    $ ./bin/opensearch-plugin install analysis-icu
    
  • config/opensearch.yml を設定して起動してみる
    $ vi ./config/opensearch.yml
    cluster.name: opensearch_dolphin
    path.data: /home/dolphin/opensearch/var/lib/opensearch
    path.logs: /home/dolphin/opensearch/var/log/opensearch
    $ ./bin/opensearch
    WARNING: Using incubator modules: jdk.incubator.vector
    WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
     :
    
  • 今回、@FullTextField を変更したので、インデックス更新が必要。しかし、masuda 先生のコードをパクったお陰で、インデックス更新が6倍速になったので、あまり苦ではない。

wildfly 起動

2026-09-16 17:17:04,277 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly 41.0.1.Final-SNAPSHOT (WildFly Core 33.0.1.Final) started in 5769ms - Started 634 of 822 services (366 services are lazy, passive or on-demand) - Server configuration file in use: standalone.xml - Minimum feature stability level: community

WildFly アップデート記録
  • 2008年 JBossAS 4.0.5
  • 2009年 JBossAS 4.2.3
  • 2010年 JBossAS 5.1.0
  • 2013年 JBossAS 7.1.4
  • 2015年 WildFly 8.2.1
  • 2017年 WildFly 10.2.0
  • 2019年 WildFly 18.0.1
  • 2021年 WildFly 25.0.2
  • 2023年 WildFly 27.0.2
  • 2024年 WildFly 34.0.1
  • 2025年 WildFly 38.0.1
  • 2026年 WildFly 41.0.1

« 2026年2月 | トップページ

検索