forked from CITKParus/P8-ExchangeService
Схема валидации файла конфигурации и её внедрение в сервер приложений
This commit is contained in:
parent
bdede40ae4
commit
7d705cb9fc
@ -25,7 +25,7 @@ let dbConnect = {
|
|||||||
let outgoing = {
|
let outgoing = {
|
||||||
//Размер блока одновременно обрабатываемых исходящих сообщений
|
//Размер блока одновременно обрабатываемых исходящих сообщений
|
||||||
nPortionSize: 1,
|
nPortionSize: 1,
|
||||||
//Скорость проверки наличия исходящих сообщений (мс)
|
//Интервал проверки наличия исходящих сообщений (мс)
|
||||||
nCheckTimeout: 5000
|
nCheckTimeout: 5000
|
||||||
};
|
};
|
||||||
|
|
||||||
|
73
core/app.js
73
core/app.js
@ -7,10 +7,13 @@
|
|||||||
// Подключение библиотек
|
// Подключение библиотек
|
||||||
//----------------------
|
//----------------------
|
||||||
|
|
||||||
const lg = require("../core/logger"); //Протоколирование работы
|
const lg = require("./logger"); //Протоколирование работы
|
||||||
const db = require("../core/db_connector"); //Взаимодействие с БД
|
const db = require("./db_connector"); //Взаимодействие с БД
|
||||||
const oq = require("../core/out_queue"); //Прослушивание очереди исходящих сообщений
|
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 {
|
class ParusAppServer {
|
||||||
//конструктор класса
|
//конструктор класса
|
||||||
constructor(prms) {
|
constructor() {
|
||||||
//Создаём подключение к БД
|
|
||||||
this.dbConn = new db.DBConnector(prms.dbConnect);
|
|
||||||
//Создаём логгер для протоколирования работы
|
//Создаём логгер для протоколирования работы
|
||||||
this.logger = new lg.Logger();
|
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.onDBConnected = this.onDBConnected.bind(this);
|
||||||
this.onDBDisconnected = this.onDBDisconnected.bind(this);
|
this.onDBDisconnected = this.onDBDisconnected.bind(this);
|
||||||
}
|
}
|
||||||
//При подключении к БД
|
//При подключении к БД
|
||||||
async onDBConnected(connection) {
|
async onDBConnected(connection) {
|
||||||
this.logger.setDBConnector(this.dbConn);
|
this.logger.setDBConnector(this.dbConn, true);
|
||||||
await this.logger.info("Сервер приложений подключен к БД");
|
await this.logger.info("Сервер приложений подключен к БД");
|
||||||
}
|
}
|
||||||
//При отключении от БД
|
//При отключении от БД
|
||||||
@ -39,37 +42,53 @@ class ParusAppServer {
|
|||||||
this.logger.removeDBConnector();
|
this.logger.removeDBConnector();
|
||||||
await this.logger.warn("Сервер приложений отключен от БД");
|
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() {
|
async run() {
|
||||||
await this.logger.info("Запуск сервера приложений...");
|
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_CONNECTED, this.onDBConnected);
|
||||||
this.dbConn.on(db.SEVT_DB_CONNECTOR_DISCONNECTED, this.onDBDisconnected);
|
this.dbConn.on(db.SEVT_DB_CONNECTOR_DISCONNECTED, this.onDBDisconnected);
|
||||||
await this.logger.info("Подключение сервера приложений к БД...");
|
await this.logger.info("Подключение сервера приложений к БД...");
|
||||||
try {
|
await this.dbConn.connect();
|
||||||
await this.dbConn.connect();
|
|
||||||
} catch (e) {
|
|
||||||
await this.logger.error("Ошибка подключения к БД: " + e.sCODE + ": " + e.sMessage);
|
|
||||||
stop();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await this.outQ.startProcessing();
|
await this.outQ.startProcessing();
|
||||||
await this.logger.info("Сервер приложений запущен");
|
await this.logger.info("Сервер приложений запущен");
|
||||||
}
|
}
|
||||||
//Останов сервера
|
//Останов сервера
|
||||||
async stop() {
|
async stop() {
|
||||||
await this.logger.warn("Останов сервера приложений...");
|
await this.logger.warn("Останов сервера приложений...");
|
||||||
await this.outQ.stopProcessing();
|
if (this.outQ) await this.outQ.stopProcessing();
|
||||||
if (this.dbConn.bConnected) {
|
if (this.dbConn) {
|
||||||
await this.logger.warn("Отключение сервера приложений от БД...");
|
if (this.dbConn.bConnected) {
|
||||||
try {
|
await this.logger.warn("Отключение сервера приложений от БД...");
|
||||||
await this.dbConn.disconnect();
|
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);
|
process.exit(0);
|
||||||
} catch (e) {
|
|
||||||
await this.logger.error("Ошибка отключения от БД: " + e.sCODE + ": " + e.sMessage);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
process.exit(0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
118
models/obj_config.js
Normal file
118
models/obj_config.js
Normal 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;
|
Loading…
x
Reference in New Issue
Block a user