Схема валидации файла конфигурации и её внедрение в сервер приложений

This commit is contained in:
Mikhail Chechnev 2018-11-27 18:57:47 +03:00
parent bdede40ae4
commit 7d705cb9fc
3 changed files with 165 additions and 28 deletions

View File

@ -25,7 +25,7 @@ let dbConnect = {
let outgoing = {
//Размер блока одновременно обрабатываемых исходящих сообщений
nPortionSize: 1,
//Скорость проверки наличия исходящих сообщений (мс)
//Интервал проверки наличия исходящих сообщений (мс)
nCheckTimeout: 5000
};

View File

@ -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,26 +42,41 @@ 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.outQ.startProcessing();
await this.logger.info("Сервер приложений запущен");
}
//Останов сервера
async stop() {
await this.logger.warn("Останов сервера приложений...");
await this.outQ.stopProcessing();
if (this.outQ) await this.outQ.stopProcessing();
if (this.dbConn) {
if (this.dbConn.bConnected) {
await this.logger.warn("Отключение сервера приложений от БД...");
try {
@ -73,6 +91,7 @@ class ParusAppServer {
}
}
}
}
//------------------
// Интерфейс модуля

118
models/obj_config.js Normal file
View File

@ -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;