forked from CITKParus/P8-ExchangeService
Схема валидации файла конфигурации и её внедрение в сервер приложений
This commit is contained in:
parent
bdede40ae4
commit
7d705cb9fc
@ -25,7 +25,7 @@ let dbConnect = {
|
||||
let outgoing = {
|
||||
//Размер блока одновременно обрабатываемых исходящих сообщений
|
||||
nPortionSize: 1,
|
||||
//Скорость проверки наличия исходящих сообщений (мс)
|
||||
//Интервал проверки наличия исходящих сообщений (мс)
|
||||
nCheckTimeout: 5000
|
||||
};
|
||||
|
||||
|
53
core/app.js
53
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,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
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