少し前に「オフラインのWebシステム構築」を調査・検証・プロト作成することになりました(^^;
実際に動くモノがだいぶ形になったので、少しずつ書いていこうかなと。
まずは、そもそもなんでそんなことをすることになったか…の背景から整理してみます。
オフライン機能への需要
お客さんからよく聞く要望
自分の所属組織では日頃、案件管理や販売管理のシステムを主に受託開発しています。
昔はWindows Formなどで開発するのがメインでしたが、最近だとイントラでの利用であってもWebシステムを求められることが多くなり、直近で開発したものはほとんどWebシステムでした。
で、案件管理とか販売管理システムは、実際の利用者(エンドユーザ)の方が営業担当者であったりするため
「出先でネットにつながらない場合もあるので、オフラインでシステムを利用したい。」
と言った話をよく聞きます。
また、私は実際に触ったことはないのですが、Salesforce CRMにもそういった機能があるので、よくある話なのかなと。
どんな状況下でも仕事ができるようにならねばならないとは大変だなぁと思いつつ(^^;
自分達でも欲しいケース
一方で、自分達でも欲しいときがあります(^^;
それはオフラインというよりは、手軽に起動できるWebシステム、なのかもしれませんが。
例えば、営業さんのサポートでWebシステムをデモする場合など、自分がデモする際にはノートPCに環境整ってるし特に困ることはないです。
ただ、営業の方が突如「単独でデモしたいんだけど!!」となった場合
- 操作動画でデモしてもらう
- VPNでつないでもらう
- デモ対象のWebシステムを公開サーバに置く
- その人のノートPCに環境を構築する
などなど選択肢は色々ありますが、最後の選択肢を求める人が多い気がします。
で、それなりの時間をかけて
環境準備して…
DB入れて…
APサーバ立てて…
と、環境構築するだけでそれなりに手間がかかりますし
「マシン変えた」…「他の営業にも同じ構築を」…「お客さんに貸し出す」…
などなど。手順書渡したりしても失敗したり、インストーラ作っても環境によって失敗しちゃったり。
究極的には「コピペすれば動く」くらいにもっていけると…と思ったり(^^;
組込系を上手く使うことで、この辺りも実現できるかと。
実現方法は?
オフラインと聞いて、自分がまず思い浮かぶのはhtml5を利用して…Web Storageを利用して…といったイメージです。
去年参加したhtml5j conferenceで、まさにそういう内容の話を聞きました。
http://events.html5j.org/conference/2013/11/sessions
セッションの動画が公開されてました!↓
ただ、私のいる環境ではまだhtml5でシステム提供をした経験がないし、詳しい人もいない…。
そうなると、完全にクライアント専用のGUIを新たに構築する…といった選択肢?
元々クライアントがWindows Formなどで、Webサービスと通信、みたいなクラサバで作っていれば、少し頑張ればいける気がしますが(^^;
でもそもそも提供したのがWebシステムだったりすると、エンドユーザさんとしては日頃見慣れたブラウザでの画面で操作できるのが良いわけで…。
で、去年からJava EEをメインに開発しているので、それ前提にした場合、どのように構築できるか?を模索してきました。
そこで
- Embedded GlassFish
- 組込みデータベース
を利用しつつ、いくつかの条件が揃えば実現できるのでは?ということで、実際にJava EE6で構築した運用システムのオフライン化を検証していきました。
現在作ってるもの
最終的には以下のような構成図の仕組みです。
わりと素直な構成だと思うのですが、一番の問題点はオンラインとオフラインで異なるベンダのデータベースとなっている点です。
今回オフライン構築対象のWebシステムでは、もともとMicrosoft SQL Server 2012がDBとして使われていました。
であればオフラインでは、SQL Server 2012のLocalDBとかを選択するのが素直なのですが、まだ対応したJDBCドライバがないっていう…(-_-;
まあLocalDBは開発用って感じで実際に運用で使えるかどうか、その辺りも見えないのですが;
ちなみに今後JDBCドライバを設ける予定はありそうな感じの情報も。
http://connect.microsoft.com/SQLServer/feedback/details/771612/jdbc-support-for-localdb
この「異なるベンダのデータベース」と聞いて思い出すのは、よくオラクルさんのJava EEセミナーなどでちょこちょこ聞く「JPAを使うことでデータベースの差異を吸収」「JPQLを使うことでクエリ変更も不要」という売りです(^^;
思想は理解しつつも、実際は大変だろうなぁ、ってかそもそも1つのシステム内で異なるDBを複数使うことはあまりないよなー、と聞き流していたのですが、まさか使うシチュエーションになるとはっ(^^;
でも実際に上記構築をしてみて、JPQLを利用してて良かった…と思いました。
1箇所だけNative Queryで書かれた部分があったのですが、幸いそこはJPQLに書き換え可能だったので書き換えることで問題なくいけました。
ただ、この辺に関しては色々条件がそろわないと駄目(利用してる型とかストアドがないとか)で、そこらへんはまた別途まとめようかなと思います。