diff --git a/core/service_available_controller.js b/core/service_available_controller.js index 21c6915..96a9fd0 100644 --- a/core/service_available_controller.js +++ b/core/service_available_controller.js @@ -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) { //Фиксируем ошибку в протоколе работы сервера приложений diff --git a/models/prms_service_available_controller.js b/models/prms_service_available_controller.js index fcae53a..b6f26df 100644 --- a/models/prms_service_available_controller.js +++ b/models/prms_service_available_controller.js @@ -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})` + } } });