Обработчик исходящего сообщения (начало)
This commit is contained in:
parent
51f50f2479
commit
04f218bc84
@ -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);
|
||||||
}
|
}
|
||||||
|
91
models/prms_out_queue_processor.js
Normal file
91
models/prms_out_queue_processor.js
Normal 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})`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user