forked from CITKParus/P8-ExchangeService
Обработчик очереди входящих сообщений
This commit is contained in:
parent
3c1d0c3261
commit
debaca0efa
121
core/in_queue.js
Normal file
121
core/in_queue.js
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
/*
|
||||||
|
Сервис интеграции ПП Парус 8 с WEB API
|
||||||
|
Модуль ядра: отработка очереди входящих сообщений
|
||||||
|
*/
|
||||||
|
|
||||||
|
//------------------------------
|
||||||
|
// Подключение внешних библиотек
|
||||||
|
//------------------------------
|
||||||
|
|
||||||
|
const _ = require("lodash"); //Работа с массивами и коллекциями
|
||||||
|
const EventEmitter = require("events"); //Обработчик пользовательских событий
|
||||||
|
const express = require("express"); //WEB-сервер Express
|
||||||
|
const { ServerError } = require("./server_errors"); //Типовая ошибка
|
||||||
|
const { SERR_OBJECT_BAD_INTERFACE } = require("./constants"); //Общесистемные константы
|
||||||
|
const { makeErrorText, validateObject } = require("./utils"); //Вспомогательные функции
|
||||||
|
const { NINC_EXEC_CNT_YES } = require("../models/prms_db_connector"); //Схемы валидации параметров функций модуля взаимодействия с БД
|
||||||
|
const objQueueSchema = require("../models/obj_queue"); //Схемы валидации сообщения очереди
|
||||||
|
const prmsInQueueSchema = require("../models/prms_in_queue"); //Схемы валидации параметров функций класса
|
||||||
|
|
||||||
|
//--------------------------
|
||||||
|
// Глобальные идентификаторы
|
||||||
|
//--------------------------
|
||||||
|
|
||||||
|
//Типовые события
|
||||||
|
const SEVT_IN_QUEUE_STARTED = "IN_QUEUE_STARTED"; //Обработчик очереди запущен
|
||||||
|
const SEVT_IN_QUEUE_STOPPED = "IN_QUEUE_STOPPED"; //Обработчик очереди остановлен
|
||||||
|
|
||||||
|
//------------
|
||||||
|
// Тело модуля
|
||||||
|
//------------
|
||||||
|
|
||||||
|
//Класс очереди входящих сообщений
|
||||||
|
class InQueue extends EventEmitter {
|
||||||
|
//Конструктор класса
|
||||||
|
constructor(prms) {
|
||||||
|
//Создадим экземпляр родительского класса
|
||||||
|
super();
|
||||||
|
//Проверяем структуру переданного объекта для подключения
|
||||||
|
let sCheckResult = validateObject(prms, prmsInQueueSchema.InQueue, "Параметры конструктора класса InQueue");
|
||||||
|
//Если структура объекта в норме
|
||||||
|
if (!sCheckResult) {
|
||||||
|
//Список обслуживаемых сервисов
|
||||||
|
this.services = null;
|
||||||
|
//Признак функционирования обработчика
|
||||||
|
this.bWorking = false;
|
||||||
|
//Параметры очереди
|
||||||
|
this.inComing = _.cloneDeep(prms.inComing);
|
||||||
|
//Запомним подключение к БД
|
||||||
|
this.dbConn = prms.dbConn;
|
||||||
|
//Запомним логгер
|
||||||
|
this.logger = prms.logger;
|
||||||
|
//WEB-приложение
|
||||||
|
this.webApp = express();
|
||||||
|
//WEB-сервер
|
||||||
|
this.srv = null;
|
||||||
|
} else {
|
||||||
|
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Уведомление о запуске обработчика очереди
|
||||||
|
notifyStarted() {
|
||||||
|
//Оповестим подписчиков о запуске
|
||||||
|
this.emit(SEVT_IN_QUEUE_STARTED);
|
||||||
|
}
|
||||||
|
//Уведомление об остановке обработчика очереди
|
||||||
|
notifyStopped() {
|
||||||
|
//Оповестим подписчиков об останове
|
||||||
|
this.emit(SEVT_IN_QUEUE_STOPPED);
|
||||||
|
}
|
||||||
|
//Запуск обработки очереди входящих сообщений
|
||||||
|
startProcessing(prms) {
|
||||||
|
//Проверяем структуру переданного объекта для старта
|
||||||
|
let sCheckResult = validateObject(
|
||||||
|
prms,
|
||||||
|
prmsInQueueSchema.startProcessing,
|
||||||
|
"Параметры функции запуска обработки очереди входящих сообщений"
|
||||||
|
);
|
||||||
|
//Если структура объекта в норме
|
||||||
|
if (!sCheckResult) {
|
||||||
|
//Выставляем флаг работы
|
||||||
|
this.bWorking = true;
|
||||||
|
//запоминаем список обслуживаемых сервисов
|
||||||
|
this.services = prms.services;
|
||||||
|
//Запускаем сервер
|
||||||
|
this.webApp.use("*", (req, res) => {
|
||||||
|
res.status(200).send("<html><body><center><h1>Сервер приложений ПП Пурс 8</h1></center></body></html>");
|
||||||
|
});
|
||||||
|
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! КОНТРОЛЬ ЗАПУСКА!!!!!!!!!!!!!!
|
||||||
|
this.srv = this.webApp.listen(this.inComing.nPort, () => {
|
||||||
|
//И оповещаем всех что запустились
|
||||||
|
this.notifyStarted();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Остановка обработки очереди исходящих сообщений
|
||||||
|
stopProcessing() {
|
||||||
|
//Выставляем флаг неработы
|
||||||
|
this.bWorking = false;
|
||||||
|
//Останавливаем WEB-сервер (если создавался)
|
||||||
|
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! КОНТРОЛЬ ОСТАНОВА!!!!!!!!!!!!!!
|
||||||
|
if (this.srv) {
|
||||||
|
this.srv.close(() => {
|
||||||
|
//Оповещаем всхес, что остановились
|
||||||
|
this.notifyStopped();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
//Сервер не создавался - просто оповещаем всех, что остановились
|
||||||
|
this.notifyStopped();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------
|
||||||
|
// Интерфейс модуля
|
||||||
|
//-----------------
|
||||||
|
|
||||||
|
exports.SEVT_IN_QUEUE_STARTED = SEVT_IN_QUEUE_STARTED;
|
||||||
|
exports.SEVT_IN_QUEUE_STOPPED = SEVT_IN_QUEUE_STOPPED;
|
||||||
|
exports.InQueue = InQueue;
|
56
models/prms_in_queue.js
Normal file
56
models/prms_in_queue.js
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
Сервис интеграции ПП Парус 8 с WEB API
|
||||||
|
Модели данных: описатели параметров функций обработчика очереди входящих сообщений (класс InQueue)
|
||||||
|
*/
|
||||||
|
|
||||||
|
//----------------------
|
||||||
|
// Подключение библиотек
|
||||||
|
//----------------------
|
||||||
|
|
||||||
|
const Schema = require("validate"); //Схемы валидации
|
||||||
|
const { inComing } = require("./obj_config"); //Схемы валидации конфигурации сервера приложений
|
||||||
|
const { defServices } = require("./obj_services"); //Схема валидации списка сервисов
|
||||||
|
const { DBConnector } = require("../core/db_connector"); //Класс взаимодействия в БД
|
||||||
|
const { Logger } = require("../core/logger"); //Класс для протоколирования работы
|
||||||
|
|
||||||
|
//------------------
|
||||||
|
// Интерфейс модуля
|
||||||
|
//------------------
|
||||||
|
|
||||||
|
//Схема валидации параметров конструктора
|
||||||
|
exports.InQueue = new Schema({
|
||||||
|
//Параметры обработки очереди входящих сообщений
|
||||||
|
inComing: {
|
||||||
|
schema: inComing,
|
||||||
|
required: true,
|
||||||
|
message: {
|
||||||
|
required: path => `Не указаны параметры обработки очереди входящих сообщений (${path})`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
//Объект для взаимодействия с БД
|
||||||
|
dbConn: {
|
||||||
|
type: DBConnector,
|
||||||
|
required: true,
|
||||||
|
message: {
|
||||||
|
type: path =>
|
||||||
|
`Объект для взаимодействия с БД (${path}) имеет некорректный тип данных (ожидалось - DBConnector)`,
|
||||||
|
required: path => `Не указан объект для взаимодействия с БД (${path})`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
//Объект для протоколирования работы
|
||||||
|
logger: {
|
||||||
|
type: Logger,
|
||||||
|
required: true,
|
||||||
|
message: {
|
||||||
|
type: path =>
|
||||||
|
`Объект для протоколирования работы (${path}) имеет некорректный тип данных (ожидалось - Logger)`,
|
||||||
|
required: path => `Не указаны объект для протоколирования работы (${path})`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//Схема валидации параметров функции запуска обслуживания очереди
|
||||||
|
exports.startProcessing = new Schema({
|
||||||
|
//Список обслуживаемых сервисов
|
||||||
|
services: defServices(true, "services")
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user