diff --git a/core/out_queue_processor.js b/core/out_queue_processor.js new file mode 100644 index 0000000..fb3b261 --- /dev/null +++ b/core/out_queue_processor.js @@ -0,0 +1,96 @@ +/* + Сервис интеграции ПП Парус 8 с WEB API + Модуль ядра: обработчик исходящего сообщения +*/ + +//---------------------- +// Подключение библиотек +//---------------------- + +const _ = require("lodash"); //Работа с массивами и коллекциями +const { makeModuleFullPath, validateObject } = require("./utils"); //Вспомогательные функции +const { ServerError } = require("./server_errors"); //Типовая ошибка +const { NQUEUE_EXEC_STATE_APP_OK, NQUEUE_EXEC_STATE_APP_ERR } = require("../models/obj_queue"); //Схема валидации сообщения очереди обмена +const objOutQueueProcessorSchema = require("../models/obj_out_queue_processor"); //Схема валидации сообщений обмена с бработчиком очереди исходящих сообщений +const { + SERR_MODULES_BAD_INTERFACE, + SERR_OBJECT_BAD_INTERFACE, + SERR_MODULES_NO_MODULE_SPECIFIED +} = require("./constants"); //Глобальные константы + +//-------------------------- +// Глобальные идентификаторы +//-------------------------- + +//Сообщени для родительского процесса +let result = { + nExecState: null, + sExecMsg: null, + blResp: null +}; + +//------------ +// Тело модуля +//------------ + +//Установка состояния ошибки в ответном сообщении +const setErrorResult = e => { + //Выставим код состояния - ошибка обработки сервером приложений + result.nExecState = NQUEUE_EXEC_STATE_APP_ERR; + //Выставим сообщение об ошибке + result.sExecMsg = e.message; +}; + +//Установка состояния успеха в ответном сообщении +const setOKResult = () => { + //Выставим код состояния - ошибка обработки сервером приложений + result.nExecState = NQUEUE_EXEC_STATE_APP_OK; + //Выставим сообщение об ошибке + result.sExecMsg = null; +}; + +//Обработка задачи +const processTask = async task => { + setTimeout(() => { + setOKResult(); + process.send(result); + }, 3000); +}; + +//--------------------------------- +// Управление процессом обработчика +//--------------------------------- + +//Перехват CTRL + C (останов процесса) +process.on("SIGINT", async () => {}); + +//Перехват CTRL + \ (останов процесса) +process.on("SIGQUIT", () => {}); + +//Перехват мягкого останова процесса +process.on("SIGTERM", () => {}); + +//Перехват ошибок +process.on("uncaughtException", e => { + //Выставляем ошибку в сообщении + setErrorResult(e); + //Отправляем ответ родительскому процессу + process.send(result); +}); + +//Приём сообщений +process.on("message", task => { + //Проверяем структуру переданного сообщения + let sCheckResult = validateObject( + task, + objOutQueueProcessorSchema.OutQueueProcessorTask, + "Задача обработчика очереди исходящих сообщений" + ); + //Если структура объекта в норме + if (!sCheckResult) { + //Запускаем обработку + processTask(task); + } else { + throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); + } +}); diff --git a/models/obj_out_queue_processor.js b/models/obj_out_queue_processor.js new file mode 100644 index 0000000..3df1948 --- /dev/null +++ b/models/obj_out_queue_processor.js @@ -0,0 +1,72 @@ +/* + Сервис интеграции ПП Парус 8 с WEB API + Модели данных: описатель сообщений обмена с обработчиком очереди исходящих сообщений +*/ + +//---------------------- +// Подключение библиотек +//---------------------- + +const Schema = require("validate"); //Схемы валидации +const { Queue } = require("./obj_queue"); //Схема валидации сообщения очереди обмена +const { Service } = require("./obj_service"); //Схема валидации сервиса +const { NQUEUE_EXEC_STATE_APP_OK, NQUEUE_EXEC_STATE_APP_ERR } = require("./obj_queue"); //Схема валидации сообщения очереди обмена + +//------------------ +// Интерфейс модуля +//------------------ + +//Схема валидации задачи обработчику очереди исходящих сообщений +exports.OutQueueProcessorTask = new Schema({ + //Запись журнала обмена для обработки + queue: { + //schema: Queue, + required: false, + message: { + required: "Не указано обрабатываемое сообщение очереди (queue)" + } + }, + //Cервис + service: { + //schema: Service, + required: false, + message: { + required: "Не указан сервис для обработки сообщения очереди (service)" + } + } +}); + +//Схема валидации ответа обработчика очереди исходящих сообщений +exports.OutQueueProcessorTaskResult = new Schema({ + //Состояние обработки сообщения очереди обмена + nExecState: { + type: Number, + enum: [NQUEUE_EXEC_STATE_APP_OK, NQUEUE_EXEC_STATE_APP_ERR], + required: true, + message: { + type: + "Состояние обработки сообщения очереди обмена (nExecState) имеет некорректный тип данных (ожидалось - Number)", + enum: "Значение состояния обработки сообщения очереди обмена (nExecState) не поддерживается", + required: "Не указано состояние обработки сообщения очереди обмена (nExecState)" + } + }, + //Информация от обработчика сообщения очереди обмена + sExecMsg: { + type: String, + required: false, + message: { + type: + "Информация от обработчика сообщения очереди обмена (sExecMsg) имеет некорректный тип данных (ожидалось - String)", + required: "Не указана информация от обработчика сообщения очереди обмена (sExecMsg)" + } + }, + //Данные ответа + blResp: { + type: Buffer, + required: false, + message: { + type: "Данные ответа сообщения очереди обмена (blResp) имеют некорректный тип данных (ожидалось - Buffer)", + required: "Не указаны данные ответа сообщения очереди обмена (blResp)" + } + } +});