Compare commits

..

2 Commits

Author SHA1 Message Date
Mikhail Chechnev
b1bc06edc9 Релиз 2025.07.29 2025-08-04 14:56:27 +03:00
Mikhail Chechnev
61dd9e8f1a ЦИТК-977 - поддержка обмена "Универсальными сообщениями" 2025-08-04 14:35:11 +03:00
4 changed files with 26 additions and 67 deletions

View File

@ -14,7 +14,7 @@ let common = {
//Версия сервера приложений
sVersion: "8.5.6.1",
//Релиз сервера приложений
sRelease: "2025.07.01",
sRelease: "2025.07.29",
//Таймаут останова сервера (мс)
nTerminateTimeout: 60000,
//Контролировать версию Системы
@ -70,9 +70,7 @@ let inComing = {
//Максимальный размер пула подключений к БД для обработчика входящих сообщений
nPoolMax: 10,
//Шаг инкремента подключений к БД в пуле обработчика входящих сообщений
nPoolIncrement: 0,
//Время ожидания отработки входящего сообщения (мс, 0 - не применять (не отменяет таймаут по умолчанию, который может быть установлен платформой))
nTimeout: 0
nPoolIncrement: 0
};
//Параметры подключения к Kafka

View File

@ -329,28 +329,19 @@ class InQueue extends EventEmitter {
}
}
}
//Если мы еще не отдали ответ от сервера
if (!prms.res.writableFinished) {
//Всё успешно - отдаём результат клиенту
if (bStopPropagation === false) {
if (optionsResp.headers) prms.res.set(optionsResp.headers);
prms.res.status(optionsResp.statusCode || 200).send(blResp);
}
//Фиксируем успех обработки - в протоколе работы сервиса
await this.logger.info(`Входящее сообщение ${q.nId} успешно отработано`, { nQueueId: q.nId });
//Фиксируем успех обработки - в статусе сообщения
q = await this.dbConn.setQueueState({
nQueueId: q.nId,
nIncExecCnt: NINC_EXEC_CNT_YES,
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_OK
});
} else {
//Или расскажем об ошибке
throw new ServerError(
SERR_WEB_SERVER,
"Истекло время ожидания обработки входящего запроса. Канал закрыт. Клиенту был отправлен ответ."
);
//Всё успешно - отдаём результат клиенту
if (bStopPropagation === false) {
if (optionsResp.headers) prms.res.set(optionsResp.headers);
prms.res.status(optionsResp.statusCode || 200).send(blResp);
}
//Фиксируем успех обработки - в протоколе работы сервиса
await this.logger.info(`Входящее сообщение ${q.nId} успешно отработано`, { nQueueId: q.nId });
//Фиксируем успех обработки - в статусе сообщения
q = await this.dbConn.setQueueState({
nQueueId: q.nId,
nIncExecCnt: NINC_EXEC_CNT_YES,
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_OK
});
} catch (e) {
//Тема и текст уведомления об ошибке
let sSubject = `Ошибка обработки входящего сообщения сервером приложений для функции "${prms.function.sCode}" сервиса "${prms.service.sCode}"`;
@ -384,11 +375,8 @@ class InQueue extends EventEmitter {
sMessage
});
}
//Если мы еще не отдали ответ от сервера
if (!prms.res.writableFinished) {
//Отправим ошибку клиенту
prms.res.status(500).send(makeErrorText(e));
}
//Отправим ошибку клиенту
prms.res.status(500).send(makeErrorText(e));
}
} else {
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
@ -555,21 +543,6 @@ class InQueue extends EventEmitter {
if (req.headers["content-type"] === "false") req.headers["content-type"] = "application/octet-stream";
next();
});
//Если требуется установить таймаут на обработку сообщений
if (this.inComing.nTimeout !== 0) {
//Конфигурируем сервер - устанавливаем таймаут обработки сообщений
this.webApp.use((req, res, next) => {
//Устанавливаем таймаут на ответ от сервера
res.setTimeout(this.inComing.nTimeout, () => {
//Формируем ошибку
let err = new Error("Истекло время ожидания формирования ответа для завершения текущего запроса.");
err.status = 504;
//Отправляем ошибку
next(err);
});
next();
});
}
//Конфигурируем сервер - обработка тела сообщения
this.webApp.use(bodyParser.raw({ limit: `${this.inComing.nMsgMaxSize}mb`, type: "*/*" }));
//Конфигурируем сервер - обходим все сервисы, работающие на приём сообщений
@ -612,11 +585,8 @@ class InQueue extends EventEmitter {
nServiceId: srvs.nId,
nServiceFnId: fn.nId
});
//Если мы еще не отдали ответ от сервера
if (!res.writableFinished) {
//Отправим ошибку клиенту
res.status(500).send(makeErrorText(e));
}
//Отправим ошибку клиенту
res.status(500).send(makeErrorText(e));
}
});
//...и собственный обработчик ошибок
@ -627,7 +597,7 @@ class InQueue extends EventEmitter {
nServiceFnId: fn.nId
});
//Отправим ошибку клиенту
res.status(err.status || 500).send(makeErrorText(new ServerError(SERR_WEB_SERVER, err.message)));
res.status(500).send(makeErrorText(new ServerError(SERR_WEB_SERVER, err.message)));
});
}
);

View File

@ -49,9 +49,6 @@ const validatePoolMaxInComing = val => val >= 1 && val <= 1000;
//Функция проверки значения шага инкремента подключений к БД в пуле обработчика входящих сообщений
const validatePoolIncrementInComing = val => val >= 0 && val <= 1000;
//Функция проверки значения времени ожидания отработки входящего сообщения для обработчика входящих сообщений
const validateTimeoutInComing = val => val >= 0;
//Схема валидации общих параметров сервера приложений
const common = new Schema({
//Наименование сервера приложений
@ -326,17 +323,6 @@ const inComing = new Schema({
validatePoolIncrementInComing: path =>
`Значение шага инкремента подключений к БД в пуле обработчика входящих сообщений (${path}) должно быть целым числом в диапазоне от 0 до 1000`
}
},
//Время ожидания отработки входящего сообщения (мс)
nTimeout: {
type: Number,
required: true,
use: { validateTimeoutInComing },
message: {
type: path => `Время ожидания отработки входящего сообщения (${path}) имеет некорректный тип данных (ожидалось - Number)`,
required: path => `Не указано время ожидания отработки входящего сообщения (${path})`,
validateTimeoutInComing: path => `Время ожидания отработки входящего сообщения (${path}) должно быть неотрицательным целым числом`
}
}
});

View File

@ -27,7 +27,8 @@ const tag = [
"Resolutions",
"XmlSignatureRejections",
"RecipientTitles",
"Requests"
"Requests",
"UniversalMessages"
];
//------------
@ -683,12 +684,16 @@ const beforeDocLoad = async prms => {
entId = "documentId=";
msgId = "letterId=";
break;
//Загрузка Универсального сообщения
case 6:
entId = "attachmentId=";
break;
default:
}
surl = `${surl}?${msgId}${prms.options.smsgid}&${entId}${prms.options.sentid}`;
let obj;
let rblMsg;
if (prms.queue.blMsg && prms.options.type != 5) {
if (prms.queue.blMsg && (prms.options.type != 5) && (prms.options.type != 6)) {
//Конвертируем XML из "Парус 8" в понятный "ДИАДОК" JSON
obj = await toJSON(prms.queue.blMsg.toString());
rblMsg = Buffer.from(JSON.stringify(obj));