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

This commit is contained in:
Mikhail Chechnev 2018-12-05 22:26:14 +03:00
parent 51f50f2479
commit 04f218bc84
2 changed files with 224 additions and 35 deletions

View File

@ -10,51 +10,151 @@
const _ = require("lodash"); //Работа с массивами и коллекциями const _ = require("lodash"); //Работа с массивами и коллекциями
const { makeModuleFullPath, validateObject } = require("./utils"); //Вспомогательные функции const { makeModuleFullPath, validateObject } = require("./utils"); //Вспомогательные функции
const { ServerError } = require("./server_errors"); //Типовая ошибка 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 objOutQueueProcessorSchema = require("../models/obj_out_queue_processor"); //Схема валидации сообщений обмена с бработчиком очереди исходящих сообщений
const prmsOutQueueProcessorSchema = require("../models/prms_out_queue_processor"); //Схема валидации параметров функций модуля
const objQueueSchema = require("../models/obj_queue"); //Схемы валидации сообщения очереди
const { const {
SERR_UNEXPECTED,
SERR_MODULES_BAD_INTERFACE, SERR_MODULES_BAD_INTERFACE,
SERR_OBJECT_BAD_INTERFACE, SERR_OBJECT_BAD_INTERFACE,
SERR_MODULES_NO_MODULE_SPECIFIED SERR_MODULES_NO_MODULE_SPECIFIED
} = require("./constants"); //Глобальные константы } = require("./constants"); //Глобальные константы
//!!!!!!!!!!!!!!!!!!!!!!! УБРАТЬ!!!!!!!!!!!!!!!!!!!!!!
//-------------------------- const fs = require("fs");
// Глобальные идентификаторы
//--------------------------
//Сообщени для родительского процесса
let result = {
nExecState: null,
sExecMsg: null,
blResp: null
};
//------------ //------------
// Тело модуля // Тело модуля
//------------ //------------
//Установка состояния ошибки в ответном сообщении //Отправка родительскому процессу ошибки обработки сообщения сервером приложений
const setErrorResult = e => { const sendErrorResult = prms => {
//Выставим код состояния - ошибка обработки сервером приложений //Проверяем параметры
result.nExecState = NQUEUE_EXEC_STATE_APP_ERR; let sCheckResult = validateObject(
//Выставим сообщение об ошибке prms,
result.sExecMsg = e.message; prmsOutQueueProcessorSchema.sendErrorResult,
"Параметры функции отправки ошибки обработки"
);
//Если параметры в норме
if (!sCheckResult) {
//Отправляем родительскому процессу ошибку
process.send({
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_APP_ERR,
sExecMsg: prms.sMessage,
blMsg: null,
blResp: null
});
} else {
//Отправляем родительскому процессу сведения об ошибочных параметрах
process.send({
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_APP_ERR,
sExecMsg: sCheckResult,
blMsg: null,
blResp: null
});
}
}; };
//Установка состояния успеха в ответном сообщении //Отправка родительскому процессу успеха обработки сообщения сервером приложений
const setOKResult = () => { const sendOKResult = prms => {
//Выставим код состояния - ошибка обработки сервером приложений //Проверяем параметры
result.nExecState = NQUEUE_EXEC_STATE_APP_OK; let sCheckResult = validateObject(
//Выставим сообщение об ошибке prms,
result.sExecMsg = null; prmsOutQueueProcessorSchema.sendOKResult,
"Параметры функции отправки ответа об успехе обработки"
);
//Если параметры в норме
if (!sCheckResult) {
//Отправляем родительскому процессу успех
process.send({
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_APP_OK,
sExecMsg: null,
blMsg: prms.blMsg,
blResp: prms.blResp
});
} else {
//Отправляем родительскому процессу сведения об ошибочных параметрах
process.send({
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_APP_ERR,
sExecMsg: sCheckResult,
blMsg: null,
blResp: null
});
}
};
//Отправка родительскому процессу сообщения без обработки
const sendUnChange = prms => {
//Проверяем параметры
let sCheckResult = validateObject(
prms,
prmsOutQueueProcessorSchema.sendUnChange,
"Параметры функции отправки сообщения без обработки"
);
//Если параметры в норме
if (!sCheckResult) {
process.send({
nExecState: prms.task.nExecState,
sExecMsg: null,
blMsg: prms.task.blMsg ? new Buffer(prms.task.blMsg) : null,
blResp: prms.task.blResp ? new Buffer(prms.task.blResp) : null
});
} else {
//Отправляем родительскому процессу сведения об ошибочных параметрах
process.send({
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_APP_ERR,
sExecMsg: sCheckResult,
blMsg: null,
blResp: null
});
}
}; };
//Обработка задачи //Обработка задачи
const processTask = async task => { const processTask = async prms => {
//Проверяем параметры
let sCheckResult = validateObject(
prms,
prmsOutQueueProcessorSchema.processTask,
"Параметры функции обработки задачи"
);
//Если параметры в норме
if (!sCheckResult) {
//Обработке подлежат только необработанные сервером приложений сообщения
if (
prms.task.nExecState == objQueueSchema.NQUEUE_EXEC_STATE_INQUEUE ||
prms.task.nExecState == objQueueSchema.NQUEUE_EXEC_STATE_APP_ERR
) {
setTimeout(() => { setTimeout(() => {
setOKResult(); //if (prms.task.nQueueId == 2) {
process.send(result); // sendErrorResult({ sMessage: "Ошибка отработки сообщения " + prms.task.nQueueId });
//} else {
if (prms.task.blMsg) {
let b = new Buffer(prms.task.blMsg);
fs.writeFile("c:/repos/temp/" + prms.task.nQueueId, b, err => {
if (err) {
sendErrorResult({ sMessage: err.message });
} else {
let sMsg = b.toString() + " MODIFICATION FOR " + prms.task.nQueueId;
sendOKResult({
blMsg: new Buffer(sMsg),
blResp: new Buffer("REPLAY ON " + prms.task.nQueueId)
});
}
});
} else {
sendErrorResult({
sMessage: "Ошибка отработки сообщения " + prms.task.nQueueId + ": нет данных для обработки"
});
}
//}
}, 3000); }, 3000);
} else {
//Остальные возвращаем без изменения и отработки, с сохранением статусов и сообщений
sendUnChange(prms);
}
} else {
sendErrorResult({ sMessage: sCheckResult });
}
}; };
//--------------------------------- //---------------------------------
@ -62,7 +162,7 @@ const processTask = async task => {
//--------------------------------- //---------------------------------
//Перехват CTRL + C (останов процесса) //Перехват CTRL + C (останов процесса)
process.on("SIGINT", async () => {}); process.on("SIGINT", () => {});
//Перехват CTRL + \ (останов процесса) //Перехват CTRL + \ (останов процесса)
process.on("SIGQUIT", () => {}); process.on("SIGQUIT", () => {});
@ -72,10 +172,8 @@ process.on("SIGTERM", () => {});
//Перехват ошибок //Перехват ошибок
process.on("uncaughtException", e => { process.on("uncaughtException", e => {
//Выставляем ошибку в сообщении //Отправляем ошибку родительскому процессу
setErrorResult(e); sendErrorResult({ sMessage: e.message });
//Отправляем ответ родительскому процессу
process.send(result);
}); });
//Приём сообщений //Приём сообщений
@ -89,7 +187,7 @@ process.on("message", task => {
//Если структура объекта в норме //Если структура объекта в норме
if (!sCheckResult) { if (!sCheckResult) {
//Запускаем обработку //Запускаем обработку
processTask(task); processTask({ task });
} else { } else {
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
} }

View File

@ -0,0 +1,91 @@
/*
Сервис интеграции ПП Парус 8 с WEB API
Модели данных: описатели параметров функций модуля обработки исходящих сообщений
*/
//----------------------
// Подключение библиотек
//----------------------
const Schema = require("validate"); //Схемы валидации
const { OutQueueProcessorTask } = require("./obj_out_queue_processor"); //Схемы валидации объектов обработчика исходящих сообщений
//------------
// Тело модуля
//------------
//Валидация данных сообщения очереди
const validateBuffer = val => {
//Либо null
if (val === null) {
return true;
} else {
//Либо Buffer
return val instanceof Buffer;
}
};
//------------------
// Интерфейс модуля
//------------------
//Схема валидации параметров функции отправки ошибки обработки
exports.sendErrorResult = new Schema({
//Сообщение об ошибке
sMessage: {
type: String,
required: true,
message: {
type: path => `Идентификатор сервиса (${path}) имеет некорректный тип данных (ожидалось - String)`,
required: path => `Не указан идентификатор сервиса (${path})`
}
}
});
//Схема валидации параметров функции отправки успеха обработки
exports.sendOKResult = new Schema({
//Данные сообщения очереди обмена
blMsg: {
use: { validateBuffer },
required: true,
message: {
validateBuffer: path =>
`Данные сообщения очереди обмена (${path}) имеют некорректный тип данных (ожидалось - null или Buffer)`,
required: path => `Не указаны данные сообщения очереди обмена (${path})`
}
},
//Данные ответа сообщения очереди обмена
blResp: {
use: { validateBuffer },
required: true,
message: {
validateBuffer: path =>
`Данные ответа сообщения очереди обмена (${path}) имеют некорректный тип данных (ожидалось - null или Buffer)`,
required: path => `Не указаны данные ответа сообщения очереди обмена (${path})`
}
}
}).validator({ required: val => typeof val != "undefined" });
//Параметры функции отправки сообщения родителю без обработки
exports.sendUnChange = new Schema({
//Задача обработки
task: {
schema: OutQueueProcessorTask,
required: true,
message: {
required: path => `Не указана задача для обработки (${path})`
}
}
});
//Параметры функции обработки сообщения
exports.processTask = new Schema({
//Задача обработки
task: {
schema: OutQueueProcessorTask,
required: true,
message: {
required: path => `Не указана задача для обработки (${path})`
}
}
});