From 12b5e524c16bbbc1c8c6940242622bbd4012c6cb Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Thu, 29 Nov 2018 22:10:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D1=87=D0=B8=D0=BA=20=D0=B8=D1=81=D1=85=D0=BE=D0=B4=D1=8F=D1=89?= =?UTF-8?q?=D0=B5=D0=B3=D0=BE=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20(=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D0=BE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/out_queue_processor.js | 96 +++++++++++++++++++++++++++++++ models/obj_out_queue_processor.js | 72 +++++++++++++++++++++++ 2 files changed, 168 insertions(+) create mode 100644 core/out_queue_processor.js create mode 100644 models/obj_out_queue_processor.js 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)" + } + } +});