Контроль и рассылка уведомлений о просроченных сообщениях обмена для сервиса
This commit is contained in:
parent
6fb79a34ee
commit
a522cdf3b6
@ -30,6 +30,9 @@ const NDETECTING_LOOP_DELAY = 3000;
|
||||
//Интервал проверки доступности сервисов (мс)
|
||||
const NDETECTING_LOOP_INTERVAL = 60000;
|
||||
|
||||
//Таймаут проверки доступности адреса сервиса (мс)
|
||||
const NNETWORK_CHECK_TIMEOUT = 10000;
|
||||
|
||||
//------------
|
||||
// Тело модуля
|
||||
//------------
|
||||
@ -62,8 +65,8 @@ class ServiceAvailableController extends EventEmitter {
|
||||
this.notifier = prms.notifier;
|
||||
//Запомним логгер
|
||||
this.logger = prms.logger;
|
||||
//Установим таймаут проведки адреса сервиса (мс)
|
||||
this.nCheckTimeout = 10000;
|
||||
//Запомним подключение к БД
|
||||
this.dbConn = prms.dbConn;
|
||||
//Привяжем методы к указателю на себя для использования в обработчиках событий
|
||||
this.serviceDetectingLoop = this.serviceDetectingLoop.bind(this);
|
||||
} else {
|
||||
@ -108,7 +111,7 @@ class ServiceAvailableController extends EventEmitter {
|
||||
) {
|
||||
try {
|
||||
//Отправляем проверочный запрос
|
||||
await rqp({ url: this.services[i].sSrvRoot, timeout: this.nCheckTimeout });
|
||||
await rqp({ url: this.services[i].sSrvRoot, timeout: NNETWORK_CHECK_TIMEOUT });
|
||||
//Запрос прошел - фиксируем дату доступности и сбрасываем дату недоступности
|
||||
this.services[i].dAvailable = new Date();
|
||||
this.services[i].dUnAvailable = null;
|
||||
@ -120,7 +123,7 @@ class ServiceAvailableController extends EventEmitter {
|
||||
if (e.error) {
|
||||
let sSubError = e.error.code || e.error;
|
||||
if (e.error.code === "ESOCKETTIMEDOUT")
|
||||
sSubError = `сервис не ответил на запрос в течение ${this.nCheckTimeout} мс`;
|
||||
sSubError = `сервис не ответил на запрос в течение ${NNETWORK_CHECK_TIMEOUT} мс`;
|
||||
sError = `Ошибка передачи данных: ${sSubError}`;
|
||||
}
|
||||
if (e.response) {
|
||||
@ -151,8 +154,6 @@ class ServiceAvailableController extends EventEmitter {
|
||||
let nDiffMins = Math.round(((nDiffMs % 86400000) % 3600000) / 60000);
|
||||
//Если простой больше указанного в настройках - будем оповещать по почте
|
||||
if (nDiffMins >= this.services[i].nUnavlblNtfTime) {
|
||||
//Подготовим тему для уведомления
|
||||
let sSubject = `Удалённый сервис ${this.services[i].sCode} неотвечает на запросы`;
|
||||
//Подготовим сообщение для уведомления
|
||||
let sMessage = `Сервис недоступен более ${
|
||||
this.services[i].nUnavlblNtfTime
|
||||
@ -161,23 +162,41 @@ class ServiceAvailableController extends EventEmitter {
|
||||
}`;
|
||||
//Положим уведомление в протокол работы сервера приложений
|
||||
await this.logger.error(sMessage, { nServiceId: this.services[i].nId });
|
||||
//И в почту, если есть список адресов
|
||||
if (this.services[i].sUnavlblNtfMail) {
|
||||
try {
|
||||
this.notifier.addMessage({
|
||||
sTo: this.services[i].sUnavlblNtfMail,
|
||||
sSubject,
|
||||
sMessage
|
||||
});
|
||||
} catch (e) {
|
||||
await this.logger.error(makeErrorText(e), {
|
||||
nServiceId: this.services[i].nId
|
||||
});
|
||||
}
|
||||
}
|
||||
//И в очередь уведомлений
|
||||
await this.notifier.addMessage({
|
||||
sTo: this.services[i].sUnavlblNtfMail,
|
||||
sSubject: `Удалённый сервис ${this.services[i].sCode} неотвечает на запросы`,
|
||||
sMessage
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
//Если сервис надо проверять на доступность то проверим так же - есть ли у него неотработанные сообщения обмена
|
||||
if (this.services[i].nUnavlblNtfSign == objServiceSchema.NUNAVLBL_NTF_SIGN_YES) {
|
||||
try {
|
||||
let res = await this.dbConn.getServiceExpiredQueueInfo({
|
||||
nServiceId: this.services[i].nId
|
||||
});
|
||||
//Если у сервиса есть просроченные сообщения - будет отправлять информацию об этом
|
||||
if (res.nCnt > 0) {
|
||||
//Отправляем уведомление
|
||||
await this.notifier.addMessage({
|
||||
sTo: this.services[i].sUnavlblNtfMail,
|
||||
sSubject: `Для сервиса ${
|
||||
this.services[i].sCode
|
||||
} зафиксированы просроченные сообщения обмена (${res.nCnt} ед.)`,
|
||||
sMessage: res.sInfoList
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
await this.logger.error(
|
||||
`При проверке просроченных сообщений сервиса ${this.services[i].sCode}: ${makeErrorText(
|
||||
e
|
||||
)}`,
|
||||
{ nServiceId: this.services[i].nId }
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
//Фиксируем ошибку в протоколе работы сервера приложений
|
||||
|
@ -11,6 +11,7 @@ const Schema = require("validate"); //Схемы валидации
|
||||
const { defServices } = require("./obj_services"); //Схема валидации списка сервисов
|
||||
const { Notifier } = require("../core/notifier"); //Класс рассылки уведомлений
|
||||
const { Logger } = require("../core/logger"); //Класс для протоколирования работы
|
||||
const { DBConnector } = require("../core/db_connector"); //Класс взаимодействия в БД
|
||||
|
||||
//------------------
|
||||
// Интерфейс модуля
|
||||
@ -37,6 +38,16 @@ exports.ServiceAvailableController = new Schema({
|
||||
`Объект для протоколирования работы (${path}) имеет некорректный тип данных (ожидалось - Logger)`,
|
||||
required: path => `Не указаны объект для протоколирования работы (${path})`
|
||||
}
|
||||
},
|
||||
//Объект для взаимодействия с БД
|
||||
dbConn: {
|
||||
type: DBConnector,
|
||||
required: true,
|
||||
message: {
|
||||
type: path =>
|
||||
`Объект для взаимодействия с БД (${path}) имеет некорректный тип данных (ожидалось - DBConnector)`,
|
||||
required: path => `Не указан объект для взаимодействия с БД (${path})`
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user