From 7d705cb9fc21df9bdbd2484d2828f525293fec38 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Tue, 27 Nov 2018 18:57:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D1=85=D0=B5=D0=BC=D0=B0=20=D0=B2=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B4=D0=B0=D1=86=D0=B8=D0=B8=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D1=83=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B8=20=D0=B5=D1=91=20=D0=B2=D0=BD?= =?UTF-8?q?=D0=B5=D0=B4=D1=80=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=20=D1=81?= =?UTF-8?q?=D0=B5=D1=80=D0=B2=D0=B5=D1=80=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.js | 2 +- core/app.js | 73 ++++++++++++++++---------- models/obj_config.js | 118 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 165 insertions(+), 28 deletions(-) create mode 100644 models/obj_config.js diff --git a/config.js b/config.js index d863077..6ca1a2f 100644 --- a/config.js +++ b/config.js @@ -25,7 +25,7 @@ let dbConnect = { let outgoing = { //Размер блока одновременно обрабатываемых исходящих сообщений nPortionSize: 1, - //Скорость проверки наличия исходящих сообщений (мс) + //Интервал проверки наличия исходящих сообщений (мс) nCheckTimeout: 5000 }; diff --git a/core/app.js b/core/app.js index fe83d54..e6baa63 100644 --- a/core/app.js +++ b/core/app.js @@ -7,10 +7,13 @@ // Подключение библиотек //---------------------- -const lg = require("../core/logger"); //Протоколирование работы -const db = require("../core/db_connector"); //Взаимодействие с БД -const oq = require("../core/out_queue"); //Прослушивание очереди исходящих сообщений - +const lg = require("./logger"); //Протоколирование работы +const db = require("./db_connector"); //Взаимодействие с БД +const oq = require("./out_queue"); //Прослушивание очереди исходящих сообщений +const { ServerError } = require("./server_errors"); //Типовая ошибка +const { validateObject } = require("./utils"); //Вспомогательные функции +const { SERR_COMMON, SERR_OBJECT_BAD_INTERFACE } = require("./constants"); //Общесистемные константы +const objConfigSchema = require("../models/obj_config"); //Схема валидации файла настроек //------------ // Тело модуля //------------ @@ -18,20 +21,20 @@ const oq = require("../core/out_queue"); //Прослушивание очере //Класс сервера приложений class ParusAppServer { //конструктор класса - constructor(prms) { - //Создаём подключение к БД - this.dbConn = new db.DBConnector(prms.dbConnect); + constructor() { //Создаём логгер для протоколирования работы this.logger = new lg.Logger(); - //Создаём обработчик очереди исходящих - this.outQ = new oq.OutQueue(prms.outgoing, this.dbConn, this.logger); + //Подключение к БД + this.dbConn = null; + //Обработчик очереди исходящих + this.outQ = null; //Привяжем методы к указателю на себя для использования в обработчиках событий this.onDBConnected = this.onDBConnected.bind(this); this.onDBDisconnected = this.onDBDisconnected.bind(this); } //При подключении к БД async onDBConnected(connection) { - this.logger.setDBConnector(this.dbConn); + this.logger.setDBConnector(this.dbConn, true); await this.logger.info("Сервер приложений подключен к БД"); } //При отключении от БД @@ -39,37 +42,53 @@ class ParusAppServer { this.logger.removeDBConnector(); await this.logger.warn("Сервер приложений отключен от БД"); } + //Инициализация сервера + async init(cfg) { + await this.logger.info("Инициализация сервера приложений..."); + //Проверяем структуру переданного объекта конфигурации + let sCheckResult = validateObject(cfg, objConfigSchema.config, "Настройки сервера приложений"); + //Если настройки верны - будем стартовать + if (!sCheckResult) { + //Создаём подключение к БД + this.dbConn = new db.DBConnector(cfg.dbConnect); + //Создаём обработчик очереди исходящих + this.outQ = new oq.OutQueue(cfg.outgoing, this.dbConn, this.logger); + //Скажем что инициализировали + await this.logger.info("Сервер приложение инициализирован"); + } else { + throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); + } + } //Запуск сервера async run() { await this.logger.info("Запуск сервера приложений..."); + if (!this.logger || !this.dbConn || !this.outQ) { + throw new ServerError(SERR_COMMON, "Не пройдена инициализация"); + } this.dbConn.on(db.SEVT_DB_CONNECTOR_CONNECTED, this.onDBConnected); this.dbConn.on(db.SEVT_DB_CONNECTOR_DISCONNECTED, this.onDBDisconnected); await this.logger.info("Подключение сервера приложений к БД..."); - try { - await this.dbConn.connect(); - } catch (e) { - await this.logger.error("Ошибка подключения к БД: " + e.sCODE + ": " + e.sMessage); - stop(); - return; - } + await this.dbConn.connect(); await this.outQ.startProcessing(); await this.logger.info("Сервер приложений запущен"); } //Останов сервера async stop() { await this.logger.warn("Останов сервера приложений..."); - await this.outQ.stopProcessing(); - if (this.dbConn.bConnected) { - await this.logger.warn("Отключение сервера приложений от БД..."); - try { - await this.dbConn.disconnect(); + if (this.outQ) await this.outQ.stopProcessing(); + if (this.dbConn) { + if (this.dbConn.bConnected) { + await this.logger.warn("Отключение сервера приложений от БД..."); + try { + await this.dbConn.disconnect(); + process.exit(0); + } catch (e) { + await this.logger.error("Ошибка отключения от БД: " + e.sCODE + ": " + e.sMessage); + process.exit(1); + } + } else { process.exit(0); - } catch (e) { - await this.logger.error("Ошибка отключения от БД: " + e.sCODE + ": " + e.sMessage); - process.exit(1); } - } else { - process.exit(0); } } } diff --git a/models/obj_config.js b/models/obj_config.js new file mode 100644 index 0000000..efc26d6 --- /dev/null +++ b/models/obj_config.js @@ -0,0 +1,118 @@ +/* + Сервис интеграции ПП Парус 8 с WEB API + Модели данных: описатель объекта конфигурации приложения +*/ + +//---------------------- +// Подключение библиотек +//---------------------- + +const Schema = require("validate"); //Схемы валидации + +//------------------ +// Тело моделя +//------------------ + +//Функция проверки значения размера блока одновременно обрабатываемых исходящих сообщений +const checkPortionSize = val => val >= 1 && val <= 100 && Number.isInteger(val); + +//Функция проверки значения интервала проверки наличия исходящих сообщений +const checkCheckTimeout = val => val >= 100 && val <= 60000 && Number.isInteger(val); + +//Схема валидации параметров подключения к БД +const dbConnect = new Schema({ + //Пользователь БД + sUser: { + type: String, + required: true, + message: { + type: "Имя пользователя БД (sUser) имеет некорректный тип данных (ожидалось - String)", + required: "Не указано имя пользователя БД (sUser)" + } + }, + //Пароль пользователя БД + sPassword: { + type: String, + required: true, + message: { + type: "Пароль пользователя БД (sPassword) имеет некорректный тип данных (ожидалось - String)", + required: "Не указан пароль пользователя БД (sPassword)" + } + }, + //Строка подключения к БД + sConnectString: { + type: String, + required: true, + message: { + type: "Строка подключения к БД (sConnectString) имеет некорректный тип данных (ожидалось - String)", + required: "Не указана строка подключения к БД (sConnectString)" + } + }, + //Наименование сервера приложений в сессии БД + sSessionAppName: { + type: String, + required: true, + message: { + type: + "Наименование сервера приложений в сессии БД (sSessionAppName) имеет некорректный тип данных (ожидалось - String)", + required: "Не указано наименование сервера приложений в сессии БД (sSessionAppName)" + } + }, + //Наименование подключаемого модуля обслуживания БД + sConnectorModule: { + type: String, + required: true, + message: { + type: + "Наименование подключаемого модуля обслуживания БД (sConnectorModule) имеет некорректный тип данных (ожидалось - String)", + required: "Не указано наименование подключаемого модуля обслуживания БД (sConnectorModule)" + } + } +}); + +//Схема валидации параметров обработки очереди исходящих сообщений +const outgoing = new Schema({ + //Размер блока одновременно обрабатываемых исходящих сообщений + nPortionSize: { + type: Number, + required: true, + use: { checkPortionSize }, + message: { + type: + "Размер блока одновременно обрабатываемых исходящих сообщений (nPortionSize) имеет некорректный тип данных (ожидалось - Number)", + required: "Не указан размер блока одновременно обрабатываемых исходящих сообщений (nPortionSize)", + checkPortionSize: + "Значение размера блока одновременно обрабатываемых исходящих сообщений (nPortionSize) должно быть целым числом в диапазоне от 1 до 100" + } + }, + //Интервал проверки наличия исходящих сообщений (мс) + nCheckTimeout: { + type: Number, + required: true, + use: { checkCheckTimeout }, + message: { + type: + "Интервал проверки наличия исходящих сообщений (nCheckTimeout) имеет некорректный тип данных (ожидалось - Number)", + required: "Не указан интервал проверки наличия исходящих сообщений (nCheckTimeout)", + checkCheckTimeout: + "Значение интервала проверки наличия исходящих сообщений (nCheckTimeout) должно быть целым числом в диапазоне от 100 до 60000" + } + } +}); + +//Схема валидации файла конфигурации +const config = new Schema({ + dbConnect, + outgoing +}); + +//------------------ +// Интерфейс модуля +//------------------ + +//Схема валидации записи журнала работы сервиса обмена +exports.dbConnect = dbConnect; +//Схема валидации параметров обработки очереди исходящих сообщений +exports.outgoing = outgoing; +//Схема валидации файла конфигурации +exports.config = config;