diff --git a/core/app.js b/core/app.js index 4fa069e..bbba0e4 100644 --- a/core/app.js +++ b/core/app.js @@ -177,7 +177,7 @@ class ParusAppServer { if (this.dbConn.bConnected) { await this.logger.warn("Отключение сервера приложений от БД..."); try { - await this.dbConn.disconnect({ bServerClose: true }); + await this.dbConn.disconnect(); } catch (e) { await this.logger.error(`Ошибка отключения от БД: ${e.sCode}: ${e.sMessage}`); } @@ -213,7 +213,8 @@ class ParusAppServer { nPoolMax: prms.config.inComing.nPoolMax, nPoolIncrement: prms.config.inComing.nPoolIncrement, nMaxWorkers: prms.config.outGoing.nMaxWorkers - } + }, + bServer: true }); //Создаём модуль рассылки уведомлений this.notifier = new ntf.Notifier({ logger: this.logger, mail: prms.config.mail }); @@ -275,7 +276,7 @@ class ParusAppServer { this.srvAvlCtrl.on(sac.SEVT_SERVICE_AVAILABLE_CONTROLLER_STOPPED, this.onServiceACStopped); //Подключаемся к БД await this.logger.info("Подключение сервера приложений к БД..."); - await this.dbConn.connect({ bServerStart: true }); + await this.dbConn.connect(); } //Останов сервера async stop(terminateTimeout) { diff --git a/core/db_connector.js b/core/db_connector.js index 62237c2..d15886b 100644 --- a/core/db_connector.js +++ b/core/db_connector.js @@ -74,6 +74,7 @@ class DBConnector extends EventEmitter { this.connection = null; this.bConnected = false; this.nExsSrv = null; + this.bServer = prms.bServer === true ? true : false; } else { throw new ServerError(SERR_MODULES_NO_MODULE_SPECIFIED, "Не указано имя подключаемого модуля-коннектора!"); } @@ -95,64 +96,68 @@ class DBConnector extends EventEmitter { } } //Подключиться к БД - async connect(prms) { + async connect() { //Подключаемся только если ещё не подключены if (!this.bConnected) { - //Проверяем структуру переданного объекта с параметрами для подключения к БД - let sCheckResult = validateObject(prms, prmsDBConnectorSchema.connect, "Параметры функции подключения к БД"); - //Если структура объекта в норме - if (!sCheckResult) { - try { - //Подготовим параметры для передачи в БД - let connectData = _.cloneDeep(prms); - connectData.connectSettings = this.connectSettings; - //Подключаемся - let res = await this.connector.connect(connectData); - //Сохраняем информацию о подключении - this.connection = res.pool; - //Сохраняем информацию о сервере интеграции - this.nExsSrv = res.nExsSrv; - //Выставим внутренний флаг подключения - this.bConnected = true; - //Расскажем всем, что подключились - this.emit(SEVT_DB_CONNECTOR_CONNECTED, this.connection); - //Возвращаем подключение - return this.connection; - } catch (e) { - throw new ServerError(SERR_DB_CONNECT, e.message); + try { + //Подключаемся + this.connection = await this.connector.connect(this.connectSettings); + //Если это запуск сервиса интеграции + if (this.bServer) { + //Проверяем общие условия запуска + await this.connector.checkAppStart({ + bControlSystemVersion: this.connectSettings.bControlSystemVersion, + sRelease: this.connectSettings.sRelease, + nWorkers: this.connectSettings.nMaxWorkers, + sServerName: this.connectSettings.exsSrv.sServerName, + sModuleName: this.connectSettings.exsSrv.sServerName + ? `${this.connectSettings.sSessionAppName}$${this.connectSettings.exsSrv.sServerName}` + : this.connectSettings.sSessionAppName, + connection: this.connection + }); + //Если сервис интеграции разделяется на сервера + if (this.connectSettings.exsSrv.sServerName) { + //Инициализируем информацию о сервере интеграции + this.nExsSrv = await this.connector.initServer({ + sServerName: this.connectSettings.exsSrv.sServerName, + sServerIP: this.connectSettings.exsSrv.sServerIP, + nMaxWorkers: this.connectSettings.nMaxWorkers, + connection: this.connection + }); + } } - } else { - throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); + //Выставим внутренний флаг подключения + this.bConnected = true; + //Расскажем всем, что подключились + this.emit(SEVT_DB_CONNECTOR_CONNECTED, this.connection); + //Возвращаем подключение + return this.connection; + } catch (e) { + throw new ServerError(SERR_DB_CONNECT, e.message); } } } //Отключиться от БД - async disconnect(prms) { + async disconnect() { //Смысл отключаться есть только когда мы подключены, в противном случае - зачем тратить время if (this.bConnected) { - //Проверяем структуру переданного объекта с параметрами для подключения к БД - let sCheckResult = validateObject(prms, prmsDBConnectorSchema.disconnect, "Параметры функции отключения от БД"); - //Если структура объекта в норме - if (!sCheckResult) { - try { - //Подготовим параметры для передачи в БД - let disconnectData = _.cloneDeep(prms); - disconnectData.connection = this.connection; - disconnectData.nExsSrv = this.nExsSrv; - //Отключаемся - await this.connector.disconnect(disconnectData); - //Забываем подключение и удаляем флаги подключенности - this.connection = null; - this.bConnected = false; - //Расскажем всем, что отключились - this.emit(SEVT_DB_CONNECTOR_DISCONNECTED); - //Вернём ничего - return; - } catch (e) { - throw new ServerError(SERR_DB_DISCONNECT, e.message); + try { + //Если указана информация о сервере и это закрытие сервиса интеграции + if (this.nExsSrv && this.bServer) { + //Очищаем информацию о сервере + await this.connector.clearServer({ nExsSrv: this.nExsSrv, connection: this.connection }); } - } else { - throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); + //Отключаемся + await this.connector.disconnect({ connection: this.connection }); + //Забываем подключение и удаляем флаги подключенности + this.connection = null; + this.bConnected = false; + //Расскажем всем, что отключились + this.emit(SEVT_DB_CONNECTOR_DISCONNECTED); + //Вернём ничего + return; + } catch (e) { + throw new ServerError(SERR_DB_DISCONNECT, e.message); } } } diff --git a/core/out_queue_processor.js b/core/out_queue_processor.js index bc99364..3583925 100644 --- a/core/out_queue_processor.js +++ b/core/out_queue_processor.js @@ -604,7 +604,7 @@ const processTask = async prms => { logger.removeDBConnector(); }); //Подключаемся к БД - await dbConn.connect({ bServerStart: false }); + await dbConn.connect(); //Считываем запись очереди q = await dbConn.getQueue({ nQueueId: prms.task.nQueueId }); //Далее работаем от статуса считанной записи @@ -709,12 +709,12 @@ const processTask = async prms => { } } //Отключаемся от БД - if (dbConn) await dbConn.disconnect({ bServerClose: false }); + if (dbConn) await dbConn.disconnect(); //Отправляем успех sendOKResult(); } catch (e) { //Отключаемся от БД - if (dbConn) await dbConn.disconnect({ bServerClose: false }); + if (dbConn) await dbConn.disconnect(); //Отправляем ошибку if (e instanceof ServerError && e.sCode == SERR_UNAUTH) sendUnAuthResult(); else sendErrorResult({ sMessage: makeErrorText(e) }); diff --git a/models/prms_db_connector.js b/models/prms_db_connector.js index 0600209..8cc03db 100644 --- a/models/prms_db_connector.js +++ b/models/prms_db_connector.js @@ -74,32 +74,6 @@ exports.DBConnector = new Schema({ } }); -//Схема валидации параметров функции подключения к БД -exports.connect = new Schema({ - //Признак запуска сервера интеграции - bServerStart: { - type: Boolean, - required: true, - message: { - type: path => `Признак запуска сервера интеграции (${path}) имеет некорректный тип данных (ожидалось - Boolean)`, - required: path => `Не указан признак запуска сервера интеграции (${path})` - } - } -}); - -//Схема валидации параметров функции отключения от БД -exports.disconnect = new Schema({ - //Признак выключения сервера интеграции - bServerClose: { - type: Boolean, - required: true, - message: { - type: path => `Признак выключения сервера интеграции (${path}) имеет некорректный тип данных (ожидалось - Boolean)`, - required: path => `Не указан признак выключения сервера интеграции (${path})` - } - } -}); - //Схема валидации параметров функции получения списка функций сервиса exports.getServiceFunctions = new Schema({ //Идентификатор сервиса diff --git a/modules/parus_oracle_db.js b/modules/parus_oracle_db.js index 3352e94..4f3fdf5 100644 --- a/modules/parus_oracle_db.js +++ b/modules/parus_oracle_db.js @@ -185,24 +185,20 @@ const clearServer = async prms => { //Подключение к БД const connect = async prms => { try { - //Инициализируем результат подключения - let connection = { pool: null, nExsSrv: null }; //Определяем наименование модуля сессии - let moduleName = prms.connectSettings.exsSrv.sServerName - ? `${prms.connectSettings.sSessionAppName}$${prms.connectSettings.exsSrv.sServerName}` - : prms.connectSettings.sSessionAppName; + let moduleName = prms.exsSrv.sServerName ? `${prms.sSessionAppName}$${prms.exsSrv.sServerName}` : prms.sSessionAppName; //Создаем пул подключения - connection.pool = await oracledb.createPool({ - user: prms.connectSettings.sUser, - password: prms.connectSettings.sPassword, - connectString: prms.connectSettings.sConnectString, + let pool = await oracledb.createPool({ + user: prms.sUser, + password: prms.sPassword, + connectString: prms.sConnectString, queueTimeout: 600000, - poolMin: prms.connectSettings.nPoolMin ? prms.connectSettings.nPoolMin : 4, - poolMax: prms.connectSettings.nPoolMax ? prms.connectSettings.nPoolMax : 4, - poolIncrement: prms.connectSettings.nPoolIncrement ? prms.connectSettings.nPoolIncrement : 0, + poolMin: prms.nPoolMin ? prms.nPoolMin : 4, + poolMax: prms.nPoolMax ? prms.nPoolMax : 4, + poolIncrement: prms.nPoolIncrement ? prms.nPoolIncrement : 0, sessionCallback: (connection, requestedTag, callback) => { connection.module = moduleName; - connection.execute(`ALTER SESSION SET CURRENT_SCHEMA=${prms.connectSettings.sSchema}`).then( + connection.execute(`ALTER SESSION SET CURRENT_SCHEMA=${prms.sSchema}`).then( r => { callback(null, connection); }, @@ -212,29 +208,7 @@ const connect = async prms => { ); } }); - //Если это запуск сервиса интеграции - if (prms.bServerStart) { - //Проверяем общие условия запуска - await checkAppStart({ - bControlSystemVersion: prms.connectSettings.bControlSystemVersion, - sRelease: prms.connectSettings.sRelease, - nWorkers: prms.connectSettings.nMaxWorkers, - sServerName: prms.connectSettings.exsSrv.sServerName, - sModuleName: moduleName, - connection: connection.pool - }); - //Если сервис интеграции разделяется на сервера - if (prms.connectSettings.exsSrv.sServerName) { - //Инициализируем информацию о сервере интеграции - connection.nExsSrv = await initServer({ - sServerName: prms.connectSettings.exsSrv.sServerName, - sServerIP: prms.connectSettings.exsSrv.sServerIP, - nMaxWorkers: prms.connectSettings.nMaxWorkers, - connection: connection.pool - }); - } - } - return connection; + return pool; } catch (e) { throw new Error(e.message); } @@ -243,11 +217,6 @@ const connect = async prms => { //Отключение от БД const disconnect = async prms => { try { - //Если указана информация о сервере и это закрытие сервиса интеграции - if (prms.nExsSrv && prms.bServerClose) { - //Очищаем информацию о сервере - await clearServer({ nExsSrv: prms.nExsSrv, connection: prms.connection }); - } //Отключаем от базы данных await prms.connection.close(NPOOL_DRAIN_TIME); return; @@ -551,6 +520,9 @@ exports.DT_CLOB = DT_CLOB; exports.DT_BLOB = DT_BLOB; exports.DT_CURSOR = DT_CURSOR; exports.executeStored = executeStored; +exports.checkAppStart = checkAppStart; +exports.initServer = initServer; +exports.clearServer = clearServer; exports.connect = connect; exports.disconnect = disconnect; exports.getServices = getServices; diff --git a/modules/parus_pg_db.js b/modules/parus_pg_db.js index 5e0a30e..a430d38 100644 --- a/modules/parus_pg_db.js +++ b/modules/parus_pg_db.js @@ -188,14 +188,8 @@ const clearServer = async prms => { //Подключение к БД const connect = async prms => { try { - //Инициализируем результат подключения - let connection = { pool: null, nExsSrv: null }; - //Определяем наименование модуля сессии - let moduleName = prms.connectSettings.exsSrv.sServerName - ? `${prms.connectSettings.sSessionAppName}$${prms.connectSettings.exsSrv.sServerName}` - : prms.connectSettings.sSessionAppName; //Создаем пул подключения - connection.pool = new pg.Pool({ + let pool = new pg.Pool({ connectionString: `postgres://${prms.connectSettings.sUser}:${prms.connectSettings.sPassword}@${prms.connectSettings.sConnectString}`, connectionTimeoutMillis: 600000, min: prms.connectSettings.nPoolMin ? prms.connectSettings.nPoolMin : 4, @@ -204,29 +198,7 @@ const connect = async prms => { pool.on("acquire", async client => { await client.query(`select ALTER_SESSION_SET_SCHEMA($1);`, [prms.connectSettings.sSchema]); }); - //Если это запуск сервиса интеграции - if (prms.bServerStart) { - //Проверяем общие условия запуска - await checkAppStart({ - bControlSystemVersion: prms.connectSettings.bControlSystemVersion, - sRelease: prms.connectSettings.sRelease, - nWorkers: prms.connectSettings.nMaxWorkers, - sServerName: prms.connectSettings.exsSrv.sServerName, - sModuleName: moduleName, - connection: connection.pool - }); - //Если сервис интеграции разделяется на сервера - if (prms.connectSettings.exsSrv.sServerName) { - //Инициализируем информацию о сервере интеграции - connection.nExsSrv = await initServer({ - sServerName: prms.connectSettings.exsSrv.sServerName, - sServerIP: prms.connectSettings.exsSrv.sServerIP, - nMaxWorkers: prms.connectSettings.nMaxWorkers, - connection: connection.pool - }); - } - } - return connection; + return pool; } catch (e) { throw new Error(e.message); } @@ -235,11 +207,6 @@ const connect = async prms => { //Отключение от БД const disconnect = async prms => { try { - //Если указана информация о сервере и это закрытие сервиса интеграции - if (prms.nExsSrv && prms.bServerClose) { - //Очищаем информацию о сервере - await clearServer({ nExsSrv: prms.nExsSrv, connection: prms.connection }); - } await prms.connection.end(); } catch (e) { throw new Error(e.message); @@ -540,6 +507,9 @@ exports.DT_CLOB = DT_CLOB; exports.DT_BLOB = DT_BLOB; exports.DT_CURSOR = DT_CURSOR; exports.executeStored = executeStored; +exports.checkAppStart = checkAppStart; +exports.initServer = initServer; +exports.clearServer = clearServer; exports.connect = connect; exports.disconnect = disconnect; exports.getServices = getServices;