Обработчик исходящего сообщения (начало)

This commit is contained in:
Mikhail Chechnev 2018-11-29 22:10:32 +03:00
parent 2e10fadccf
commit 12b5e524c1
2 changed files with 168 additions and 0 deletions

View File

@ -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);
}
});

View File

@ -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)"
}
}
});