WebSphereのJVM単位で未来日付で動かせなかった話
投稿者:しんさん 2016/03/18

特定のアプリだけ未来日付で動かしたい
アプリケーションの未来日想定のテストのため、WebSphere Application Serverの特定のJVMだけをテストのために未来日付で動かしたいというシチュエーションがありました。
泥臭くもOSの日付を変更して対応していたのですが、
- 他のアプリJVMのテストやデプロイに差し障る
- 資源のデプロイメントにかかる問題(タイムスタンプがらみ)
- ログ周りの問題(ログローテーション運用がらみ)
- ODRとの日付相違に起因したような挙動不審
などトラブルが多く、OS日付を変更せずに個別JVM単位で対応出来ないかと考えました。
JavaのTimezone設定で頑張れないか
該当のWASサーバーはIBMのAIX OS上で動作していたのですが、AIXにかぎらずUnix系のOSでは
みたいな形で、コマンドに対して環境変数でTimezoneを渡すことが出来ます。
JVMはOS上では一つのプロセスとして存在しているので、同じようなノリで
「Timezoneにどデカい値を持たせてやろう」
ということを考えました。
JVM起動の仕組み上、OS上のJavaプロセス自体に環境変数としてTimezoneを渡すのは難しそうに思ったので、Javaのプロパティで設定できないかという方向性で進めてみることにしました。
軽くしらべたところ、システムプロパティにて「user.timezone」というのがあるらしい。
そしてjavaのシステムプロパティは、コマンドの起動プションにて-Dで指定できるらしいじゃないの。
検証の結果NG。orz
ということで、簡単なJavaのコードを書いて、うまくいくのかどうかを検証してみた結果…
「Timezoneは±1日未満の範囲でしか効きませんでした!」
ということで、残念ながらJavaのTimezone指定で、未来日・過去日で動かすことは出来ませんでした。
ちゃんちゃん。
次なるプラン
OS上のJavaプロセス自体に環境変数としてTimezoneを渡せないかというのを考えています。
検証の時間がなかなか取れなくて試せていないのですけどね。
追記:OS上のJavaプロセスに環境変数としてTimezoneを渡してもダメでした
日付を標準出力するだけの簡単なjavaのコードを書いて検証してみました。
javaをキックする際に環境変数TZにでかい値を持たせて実行してみましたが、どうも環境変数TZは効いてくれませんでした。
残念ながら、インフラ的なアプローチで未来日付でJVMを動かすのはOS日付を弄る以外に難しそうです。他に良いアイデアは思いつきません。
未来日想定のテストが必要であればアプリケーションロジックに盛り込むべし
未来日想定でJVMを動かしたい場合、ミドルウェアの領域でそれを実現するのはどうやら無理そうです。
OS日付を弄るのは何かとトラブルが多いのが経験上感じていることです。
私自身はアプリ開発の経験が無いのであまり大層なことは言えないのですが、
この部分に関してはアプリケーションロジックに組み込んでしまうしか他に答えがなさそうです。
当然、「未来日想定で動かす」という機能はテストのためだけに必要で、本番向けには必要ない機能なので、どのように実装するかは十分な考慮が必要になるでしょう。
また、「日付・時刻」というあらゆる機能に影響する部分なので、アプリケーションの規模が大きくなってから実装するのはリグレッションテストの観点でハードルが高くなることでしょう。
何か調度良い落とし所があると良いんですけどね。
なんだかまとまりのない終わり方になってしまいましたが、私の頭では簡単な答えに辿り着けそうにない問題だと感じるところです。