Commit 0e7f1f7b authored by Pavel Vainerman's avatar Pavel Vainerman

(Configuration): добавил проверку доступности omniORB::endPoint.

По умолчанию недоступность игнорируется (и endPoint не добавляется), если для данного endPoint не указан параметр error_if_not_available="1".
parent de4f5bac
/* OBSOLETE DOC!!! /*! \page ConfigurationPage Конфигурирование системы
\page ConfigurationPage Конфигурирование системы
- \ref ConfigurationPage_secCommon - \ref ConfigurationPage_secCommon
- \ref ConfigurationPage_secConfFile - \ref ConfigurationPage_secOmniORB
\section ConfigurationPage_secCommon Общее описание \section ConfigurationPage_secCommon Общее описание
Для конфигурирования сиситемы используется файл (обычно "configure.xml"). Для конфигурирования сиситемы используется файл (обычно "configure.xml").
Все параметры програмно можно получить при помощи указателя на конфигуратор UniSetTypes::conf (см. UniSetTypes::Configuration). Конфигурация является глобальным объектом. Для получения доступа к ней используется фунуция auto conf = uniset_conf();
Он позволяет работать с картой объектов при помощи вызова UniSetTypes::conf->oind (см. UniSetTypes::Configuration::oind), До начала работы, обычно в функции main(), конфигурация должна быть инициализирована при помощи функции uniset_init().
картой сообщений при помощи вызова UniSetTypes::conf->mi (см. UniSetTypes::Configuration::mi), При этом третий параметр, указывающий название конфигурационного файла, является не обязательным.
получать идентификаторы сервисов... По умолчанию обрабатывается аргумент командной строки --confile filename.
Указатель UniSetTypes::conf должен быть обязательно инициализирован. Обычно это происходит в начале
функции main. Например так:
\code \code
... ...
#include <Configuration.h> #include <Configuration.h>
...@@ -30,69 +27,32 @@ int main(int argc, char **argv) ...@@ -30,69 +27,32 @@ int main(int argc, char **argv)
} }
catch(Exception& ex ) catch(Exception& ex )
{ {
unideb[Debug::CRIT] << "(main): Поймали исключение " << ex << endl; cerr << "(main): Поймали исключение " << ex << endl;
} }
catch(...) catch(...)
{ {
unideb[Debug::CRIT] << "Неизвестное исключение!!!!"<< endl; cerr << "Неизвестное исключение!!!!"<< endl;
} }
... ...
} }
\endcode \endcode
\section ConfigurationPage_secOmniORB Конфигурирование OmniORB
Для возможности задать напрямую параметры для omniORB заложена специальная секция <omniORB>.
\section ConfigurationPage_secConfFile Пример конфигурационного файла В данную секцию можно записывать любые параметры поддерживаемые библиотекой omniORB.
Формат и назавание параметров см. документацию по omniORB.
Пример:
\code \code
<?xml version = '1.0' encoding = 'koi8-r' ?> <omniORB>
<UniSetTestConfiguration> <option name="endPoint" arg="giop:tcp:host1:"/>
<option name="endPoint" arg="giop:tcp:host2:" error_if_not_available="1"/>
<!-- Общие параметры по UniSet --> </omniORB>
<UniSet>
<LocalNode name="LocalhostNode"/>
<RootSection name="UniSet"/>
<ServicesSection name="Services"/>
<ImagesPath name="images"/>
<CountOfNet name="1"/>
<RepeatCount name="3"/>
<RepeatTimeoutMS name="50"/>
<UniSetDebug name="unideb" levels="crit,warn" file=""/>
<!-- параметры для SystemGuard -->
<WatchDogTime name="0"/> <!-- [мин] -->
<PingNodeTime name="15"/> <!-- [сек] -->
<AutoStartUpTime name="1"/> <!-- [сек] -->
<DumpStateTime name="0"/><!-- [сек] -->
<SleepTickMS name="2000"/><!-- [мсек] -->
<!-- Если не указано, то считается текущий каталог -->
<ConfDir name=""/>
<DataDir name=""/>
<BinDir name=""/>
<LogDir name=""/>
<DocDir name=""/>
<LockDir name=""/>
</UniSet>
<Services section="Services">
<LocalDBServer name="DBServer1" dbnode="" dbname="Theatre" dbuser="dbadmin" dbpass="dbadmin">
<Tables></Tables>
</LocalDBServer>
</Services>
<!-- список узлов в сиситеме -->
<ListOfNodes>
<!--
Параметры:
dbnode - id db-сервера на данном узле DB(если указать "", значит нет)
-->
<Node name="LocalhostNode" dbserver="DBServer1"/>
</ListOfNodes>
</UniSetTestConfiguration>
\endcode \endcode
Для параметра 'endPoint' встроена дополнительная проверка доступности указанной адреса.
\warning По умолчанию \b недоступность \b игнорируется, если не указан параметр \a error_if_not_available="1"
*/ */
\ No newline at end of file
...@@ -167,6 +167,8 @@ namespace uniset ...@@ -167,6 +167,8 @@ namespace uniset
CORBA::ORB_ptr getORB() const; CORBA::ORB_ptr getORB() const;
const CORBA::PolicyList getPolicy() const noexcept; const CORBA::PolicyList getPolicy() const noexcept;
static bool checkOmniORBendPoint( const std::string& endPoint );
protected: protected:
Configuration(); Configuration();
......
...@@ -329,9 +329,40 @@ namespace uniset ...@@ -329,9 +329,40 @@ namespace uniset
} }
else else
{ {
const string a(omniIt.getProp("arg")); // для endPoint надо отдельно проверить доступность адреса
uinfo << "(Configuration): add omniORB option '" << p << "' " << a << endl; // иначе иницилизация omni не произойдёт, а нужно чтобы
omniParams.emplace_back( std::make_pair(p, a) ); // всё запускалось даже если сеть не вся "поднялась"
if( p == "endPoint" )
{
const string param(omniIt.getProp("arg"));
bool endPointIsAvailable = checkOmniORBendPoint(param);
// по умолчанию "недоступность" игнорируется
// но если указан параметр 'error_if_not_available'
// то кидаем исключение при недоступности
if( !endPointIsAvailable && !omniIt.getProp("error_if_not_available").empty() )
{
ostringstream err;
err << "Configuration: ERROR: endpoint '"
<< param
<< "' not available!";
ucrit << err.str() << endl;
throw Exception(err.str());
}
if( endPointIsAvailable )
{
uinfo << "(Configuration): add omniORB option '" << p << "' " << param << endl;
omniParams.emplace_back( std::make_pair(p, param) );
}
}
else
{
const string a(omniIt.getProp("arg"));
uinfo << "(Configuration): add omniORB option '" << p << "' " << a << endl;
omniParams.emplace_back( std::make_pair(p, a) );
}
} }
} }
} }
...@@ -660,6 +691,29 @@ namespace uniset ...@@ -660,6 +691,29 @@ namespace uniset
oind->initLocalNode(localNode); oind->initLocalNode(localNode);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool Configuration::checkOmniORBendPoint( const std::string& endPoint )
{
// проверяем доступность endPoint попыткой создать соединение
auto ep = omni::giopEndpoint::str2Endpoint( endPoint.c_str() );
if( !ep )
return false;
bool ret = false;
try
{
bool ret = ep->Bind();
if( ret )
ep->Shutdown();
}
catch( std::exception& ex )
{
uwarn << "(Configuration::checkOmniORBendPoint): " << ex.what() << endl;
ret = false;
}
return ret;
}
// -------------------------------------------------------------------------
xmlNode* Configuration::getNode(const string& path) const noexcept xmlNode* Configuration::getNode(const string& path) const noexcept
{ {
return unixml->findNode(unixml->getFirstNode(), path); return unixml->findNode(unixml->getFirstNode(), path);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment