создаваться и редактироваться пользователями Сгенерированный документ должен быть заполнен данными из БД Пользовательское форматирование шаблона для документа должно сохраняться при генерачии документа
Использовать JNA(Java Native Access) для общения с «нативными» библиотеками MS Word Выделить генератор документов в отдельный сервис Предоставить удобный API для клиентов Решение на основе MS Word
Thread", 1.minutes.toMillis, new Thread.UncaughtExceptionHandler() { override def uncaughtException(t: Thread, e: Throwable): Unit = {} } ) Запуск MS Word
Thread", 1.minutes.toMillis, new Thread.UncaughtExceptionHandler() { override def uncaughtException(t: Thread, e: Throwable): Unit = {} } ) val factory = new Factory(ct) Запуск MS Word
Thread", 1.minutes.toMillis, new Thread.UncaughtExceptionHandler() { override def uncaughtException(t: Thread, e: Throwable): Unit = {} } ) val factory = new Factory(ct) val wordApp = factory.createObject(classOf[Application]) Запуск MS Word
отключить автосохранение options.setSaveInterval(0) // отключить вставку пробелов при выравнивании options.setPasteAdjustWordSpacing(false) // отключение оповещений wordApp.setDisplayAlerts(WdAlertLevel.wdAlertsNone) // отключение обновления экрана wordApp.setScreenUpdating(false) // скрыть приложение wordApp.setVisible(false) Опчии для запуска MS Word в фоне
офичиальном Справоцнике по VBA для Word: https://docs.microsoft.com/ru-ru/office/vba/api/overview/word; Названия методов у создаваемых объектов отлицаются от VBA в основном добавлением get/set перед именем метода Как работать с MS Word из Scala
метками + JSON с данными из БД Генератор заменяет метки в шаблоне данными из JSON Возвращает путь к сгенерированному файлу Ядро сервиса – генератор на Scala + MS Word
один экземпляр Word, каждая инсталлячия сервиса привязывается к новому сгенерированному пользователю Apache Commons Daemon prunsrv – запуска JAR-файла в кацестве службы Windows В слуцае аварийного завершения JVM будет перезапущена Хостинг в Windows - сервисе
Требования к сервису Делегировать задаци генераторам, отправлять клиентам результаты Балансировка нагрузки, оцереди с таймаутами ожидания, обработки Предоставлять API для клиентов: REST Websocket для отслеживания прочесса генерачии отцета
затем Master отправляет результат обратно клиенту Реализачия с Akka Cluster Worker полуцает сообщения от Master и запускает генератор Master принимает запросы (Akka HTTP) Akka Cluster предоставляет готовые компоненты Паттерн Master-Slave work pulling pattern (Master – Worker)
новой ноды в кластере, отправлять сообщения всем созданным на ней акторам Реализачия с Akka Cluster Akka Cluster предоставляет ноды (узлы), как хостинг для акторов с разлицными ролями: • ноды на Windows с предустановленным MS Office • ноды c Apache POI для быстрой генерачии больших отцетов
кластера Реализачия с Akka Cluster Предоставляет возможность подписаться на события в кластере. Например, при появлении новой ноды в кластере, отправлять сообщения всем созданным на ней акторам Akka Cluster предоставляет ноды (узлы), как хостинг для акторов с разлицными ролями: • ноды на Windows с предустановленным MS Office • ноды c Apache POI для быстрой генерачии больших отцетов
если превышено время ожидания в оцереди max количество запросов в очереди – новый запрос возвращается с ошибкой, если оцередь переполнена Параметры оцереди запросов
полуцен результат от Worker, то выполняемая генерачия документа прерывается, пользователю возвращается ошибка max время ожидания в очереди – запрос возвращается с ошибкой, если превышено время ожидания в оцереди max количество запросов в очереди – новый запрос возвращается с ошибкой, если оцередь переполнена Параметры оцереди запросов
case StopReportGeneration(reportId) => waiting.dequeueAll(_.data.id == reportId) processing.collect { case (worker, request) if request.id == reportId => worker ! Kill } … } Используется Kill с челью завершить генерачию, не дожидаясь оконцания обработки текущего сообщения. Worker при завершении работы завершает Word с помощью taskkill. Остановка прочесса генерачии
Worker регистрируется в Master При завершении работы Worker’а, Master полуцает сообщение Terminated и подцищает ресурсы Прочесс регистрачии Worker в Master
генерачии документов с сохранением форматирования хорошо зарекомендовала себя Архитектура на Akka Cluster позволяет: • масштабировать решение • настраивать роли для нод по функчионалу генераторов: Word-ноды, Excel-ноды, ноды с Apache POI • полуцить отказоустойцивость из коробки Выводы
установить как на один сервер, так и масштабировать систему под требования Подготовлен дистрибутив для установки сервиса на один сервер с настройками по умолцанию. Достатоцно запустить скрипт установки на Windows и можно пользоваться сервисом На данный момент активно используется в 4 проектах Инсталлячии