Задача:
Нужно автоматизировать рабочее место пользователя, который имеет ноутбук и медленный 3G/edge и часто даже просто отсутствующий интернет. Пользователь должен не зависимо от наличия интернета редактировать свои простые документы и периодически заливать на сервер, заодно обновляя справочную информацию.
Доступа к ноутбуку пользователя не будет и даже если будет, то админить каждый ноут будет очень накладно по времени, т.к. может быть 100+ пользователей.
Требования:
1. Web-интерфейс, потому что он наиболее rich, кросс-платформенный и под него полно дизайнеров
2. Приложение должно легко устанавливаться и обновляться (одной кнопкой)
3. Приложение должно сохранять вводимые специалистом данные в in-process базу и по мере наличия интернета "синхронизироваться" с основной базой. 1 Вариант решения:
Написать приложение-сервис, которое хостит в себе веб-севис (Jetty) с сайтом (на Grails) и базу (H2 / Mongo).
Плюс, отдельное update-приложение, которое занимается обновлением сервиса — останавливает сервис, поднимать рядом новую версию сервиса, накатывать на базу миграции, проверяет работоспособность поднятого, удаляет старое и если что — все корректно откатывает и т.д.
Меня смущает такой способ обновления по нескольким причинам:
1. Сложность написания приложения без ошибок и трудность автоматизации тестирования обновления (время разработки может растянуться на неопределенный срок)
2. В случае бага, падения update-приложения, разрядки батареи ноута и т.д. возможна ситауция, когда работа приложения не будет восстановлена и пользователь не сможет работать с приложением, а это критично для бизнеса, а так же не просто будет выяснить как именно все сломалось и написать приложение для восстанавления работы сломанного приложения. 2 Вариант решения:
(сразу скажу, что в Java опыта нет, но прилично пописал в .net, поэтому делайте скидку на случай бредовости решения)
Вместо сервиса сделать standalone-приложение, которое не только хостит в себе веб-сервер и базу, но и окно в котором хоститься браузер (ui-элемент), который в себе отображает хостящийся сайт.
Для обновления использовать Web Start (jnlp). База будет лежать рядом вне jnlp-файла.
При обновлении jnlp-приложения (на сколько я понимаю механизм уже хорошо отлажен) и первом запуске обновленного приложения будет проверяться версия базы и если нужно — накатываться миграции.
Тут все выглядит проще и надежнее (для меня):
— не нужно писать свой механизм обновления
— не нужно посылать пользователя в браузер по урлу localhost:xxxx — он просто работает с приложением
— не нужно писать сервис, который сложнее в администрировании, отладке и обновлении (могут требоваться перезагрузки)
— если что-то сломается, можно обновить jnlp файл, он автоматом обновится у пользователя и все заработает как надо (хотя фаза выяснения состояния сломанного приложения на ноуте пользователя все равно есть и может сильно все усложнять).
Вопросы:
1. На сколько рабочий 1 вариант решения?
1. На сколько состоятелен 2 вариант решения?
2. Какие более простые способы есть написания такого типа приложения? Из ограничений — JVM и open source.