ЦИТК-659 - Возможность работы нескольких серверов параллельно

This commit is contained in:
Dollerino 2025-06-03 13:24:07 +03:00
parent 5f88a45710
commit 30f7d59623
5 changed files with 24 additions and 21 deletions

View File

@ -10,7 +10,7 @@
const _ = require("lodash"); //Работа с массивами и объектами const _ = require("lodash"); //Работа с массивами и объектами
const EventEmitter = require("events"); //Обработчик пользовательских событий const EventEmitter = require("events"); //Обработчик пользовательских событий
const { ServerError } = require("./server_errors"); //Типовая ошибка const { ServerError } = require("./server_errors"); //Типовая ошибка
const { makeModuleFullPath, validateObject } = require("./utils"); //Вспомогательные функции const { makeModuleFullPath, makeServerModuleName, validateObject } = require("./utils"); //Вспомогательные функции
const prmsDBConnectorSchema = require("../models/prms_db_connector"); //Схемы валидации параметров функций модуля const prmsDBConnectorSchema = require("../models/prms_db_connector"); //Схемы валидации параметров функций модуля
const intfDBConnectorModuleSchema = require("../models/intf_db_connector_module"); //Схема валидации интерфейса модуля взаимодействия с БД const intfDBConnectorModuleSchema = require("../models/intf_db_connector_module"); //Схема валидации интерфейса модуля взаимодействия с БД
const objServiceSchema = require("../models/obj_service"); //Схема валидации сервиса const objServiceSchema = require("../models/obj_service"); //Схема валидации сервиса
@ -110,9 +110,7 @@ class DBConnector extends EventEmitter {
sRelease: this.connectSettings.sRelease, sRelease: this.connectSettings.sRelease,
nWorkers: this.connectSettings.nMaxWorkers, nWorkers: this.connectSettings.nMaxWorkers,
sServerName: this.connectSettings.exsSrv.sServerName, sServerName: this.connectSettings.exsSrv.sServerName,
sModuleName: this.connectSettings.exsSrv.sServerName sModuleName: makeServerModuleName(this.connectSettings.sSessionAppName, this.connectSettings.exsSrv.sServerName),
? `${this.connectSettings.sSessionAppName}$${this.connectSettings.exsSrv.sServerName}`
: this.connectSettings.sSessionAppName,
connection: this.connection connection: this.connection
}); });
//Если сервис интеграции разделяется на сервера //Если сервис интеграции разделяется на сервера

View File

@ -77,6 +77,11 @@ const makeModuleFullPath = sModuleName => {
} }
}; };
//Формирование наименование модуля сессии
const makeServerModuleName = (sSessionAppName, sServerName) => {
return sServerName ? `${sSessionAppName}$${sServerName}` : sSessionAppName;
};
//Формирование текста ошибки //Формирование текста ошибки
const makeErrorText = e => { const makeErrorText = e => {
//Сообщение об ошибке по умолчанию //Сообщение об ошибке по умолчанию
@ -425,6 +430,7 @@ const wrapPromiseTimeout = (timeout, promise) => {
exports.validateObject = validateObject; exports.validateObject = validateObject;
exports.makeModuleFullPath = makeModuleFullPath; exports.makeModuleFullPath = makeModuleFullPath;
exports.makeServerModuleName = makeServerModuleName;
exports.makeErrorText = makeErrorText; exports.makeErrorText = makeErrorText;
exports.getAppSrvModuleName = getAppSrvModuleName; exports.getAppSrvModuleName = getAppSrvModuleName;
exports.getAppSrvFunctionName = getAppSrvFunctionName; exports.getAppSrvFunctionName = getAppSrvFunctionName;

View File

@ -49,9 +49,6 @@ const validatePoolMaxInComing = val => val >= 1 && val <= 1000;
//Функция проверки значения шага инкремента подключений к БД в пуле обработчика входящих сообщений //Функция проверки значения шага инкремента подключений к БД в пуле обработчика входящих сообщений
const validatePoolIncrementInComing = val => val >= 0 && val <= 1000; const validatePoolIncrementInComing = val => val >= 0 && val <= 1000;
//Функция проверки наименования сервера приложений в сессии БД
const validateSessionAppName = val => val === "PARUS$ExchangeServer";
//Схема валидации общих параметров сервера приложений //Схема валидации общих параметров сервера приложений
const common = new Schema({ const common = new Schema({
//Наименование сервера приложений //Наименование сервера приложений
@ -146,12 +143,9 @@ const dbConnect = new Schema({
sSessionAppName: { sSessionAppName: {
type: String, type: String,
required: true, required: true,
use: { validateSessionAppName },
message: { message: {
type: path => `Наименование сервера приложений в сессии БД (${path}) имеет некорректный тип данных (ожидалось - String)`, type: path => `Наименование сервера приложений в сессии БД (${path}) имеет некорректный тип данных (ожидалось - String)`,
required: path => `Не указано наименование сервера приложений в сессии БД (${path})`, required: path => `Не указано наименование сервера приложений в сессии БД (${path})`
validateSessionAppName: path =>
`Наименование сервера приложений в сессии БД поддерживает только значение "PARUS$ExchangeServer" (${path})`
} }
}, },
//Наименование подключаемого модуля обслуживания БД //Наименование подключаемого модуля обслуживания БД

View File

@ -185,8 +185,6 @@ const clearServer = async prms => {
//Подключение к БД //Подключение к БД
const connect = async prms => { const connect = async prms => {
try { try {
//Определяем наименование модуля сессии
let moduleName = prms.exsSrv.sServerName ? `${prms.sSessionAppName}$${prms.exsSrv.sServerName}` : prms.sSessionAppName;
//Создаем пул подключения //Создаем пул подключения
let pool = await oracledb.createPool({ let pool = await oracledb.createPool({
user: prms.sUser, user: prms.sUser,
@ -197,15 +195,19 @@ const connect = async prms => {
poolMax: prms.nPoolMax ? prms.nPoolMax : 4, poolMax: prms.nPoolMax ? prms.nPoolMax : 4,
poolIncrement: prms.nPoolIncrement ? prms.nPoolIncrement : 0, poolIncrement: prms.nPoolIncrement ? prms.nPoolIncrement : 0,
sessionCallback: (connection, requestedTag, callback) => { sessionCallback: (connection, requestedTag, callback) => {
connection.module = moduleName; //Устанавливаем схему
connection.execute(`ALTER SESSION SET CURRENT_SCHEMA=${prms.sSchema}`).then( connection
r => { .execute(`ALTER SESSION SET CURRENT_SCHEMA=${prms.sSchema}`)
.then(r => {
//Устанавливаем модуль сессии
connection.execute(`begin PKG_EXS.UTL_MODULE_SET(SEXSSRV => '${prms.exsSrv.sServerName}'); end;`);
})
.then(r => {
callback(null, connection); callback(null, connection);
}, })
e => { .catch(e => {
callback(e, null); callback(e, null);
} });
);
} }
}); });
return pool; return pool;

View File

@ -139,7 +139,7 @@ const checkAppStart = async prms => {
NCONTROL_VERSION: prms.bControlSystemVersion ? 1 : 0, NCONTROL_VERSION: prms.bControlSystemVersion ? 1 : 0,
SEXS_RELEASE_DATE: prms.sRelease, SEXS_RELEASE_DATE: prms.sRelease,
NWORKERS: prms.nWorkers, NWORKERS: prms.nWorkers,
SEXSSRV: prms.sServerName, SEXSSRV: prms.sServerName !== "" ? prms.sServerName : null,
SMODULE_NAME: prms.sModuleName SMODULE_NAME: prms.sModuleName
}, },
outPrms: { outPrms: {
@ -196,7 +196,10 @@ const connect = async prms => {
max: prms.nPoolMax ? prms.nPoolMax : 4 max: prms.nPoolMax ? prms.nPoolMax : 4
}); });
pool.on("acquire", async client => { pool.on("acquire", async client => {
//Устанавливаем схему
await client.query(`select ALTER_SESSION_SET_SCHEMA($1);`, [prms.sSchema]); await client.query(`select ALTER_SESSION_SET_SCHEMA($1);`, [prms.sSchema]);
//Устанавливаем модуль сессии
await client.query(`select PKG_EXS$UTL_MODULE_SET($1);`, [prms.exsSrv.sServerName]);
}); });
return pool; return pool;
} catch (e) { } catch (e) {