SObjectizer  5.1
Открытые члены | Закрытые члены | Закрытые данные | Полный список членов класса
Класс so_5::rt::so_environment_tabstract

Среда выполнения SObjectizer. Подробнее...

Граф наследования:so_5::rt::so_environment_t:
so_sysconf_4::ntservice::ntservice_so_environment_t

Открытые члены

 so_environment_t (const so_environment_params_t &so_environment_params)
 
impl::so_environment_impl_tso_environment_impl ()
 Получить реализацию so_environment_impl.
 
Работа с mbox-ами.
mbox_ref_t create_local_mbox ()
 Создать безымянный mbox. Подробнее...
 
mbox_ref_t create_local_mbox (const nonempty_name_t &mbox_name)
 Создать именованный mbox. Подробнее...
 
mbox_ref_t create_local_mbox (std::unique_ptr< ACE_RW_Thread_Mutex > lock_ptr)
 Создать безымянный mbox, мутекс для синхронизации создается пользователем. Подробнее...
 
mbox_ref_t create_local_mbox (const nonempty_name_t &mbox_name, std::unique_ptr< ACE_RW_Thread_Mutex > lock_ptr)
 Создать именованный mbox. Подробнее...
 
Диспетчеры.
dispatcher_tquery_default_dispatcher ()
 Получить диспетчер по умолчанию.
 
dispatcher_ref_t query_named_dispatcher (const std::string &disp_name)
 Получить именованный диспетчер. Подробнее...
 
void install_exception_logger (event_exception_logger_unique_ptr_t &&logger)
 Установить логер исключений.
 
void install_exception_handler (event_exception_handler_unique_ptr_t &&handler)
 Установить обработчик исключений.
 
Работа с кооперациями.
agent_coop_unique_ptr_t create_coop (const nonempty_name_t &name)
 Создать кооперацию. Подробнее...
 
agent_coop_unique_ptr_t create_coop (const nonempty_name_t &name, disp_binder_unique_ptr_t disp_binder)
 Создать кооперацию. Подробнее...
 
ret_code_t register_coop (agent_coop_unique_ptr_t agent_coop, throwing_strategy_t throwing_strategy=THROW_ON_ERROR)
 Зарегистрировать кооперацию. Подробнее...
 
ret_code_t deregister_coop (const nonempty_name_t &name, throwing_strategy_t throwing_strategy=DO_NOT_THROW_ON_ERROR)
 Дерегистрировать кооперацию. Подробнее...
 
Работа с таймерными событиями.
template<class MESSAGE >
so_5::timer_thread::timer_id_ref_t schedule_timer (std::unique_ptr< MESSAGE > &msg, const mbox_ref_t &mbox, unsigned int delay_msec, unsigned int period_msec)
 Запланировать таймерное событие. Подробнее...
 
template<class MESSAGE >
so_5::timer_thread::timer_id_ref_t schedule_timer (std::unique_ptr< MESSAGE > &&msg, const mbox_ref_t &mbox, unsigned int delay_msec, unsigned int period_msec)
 Запланировать таймерное событие. Подробнее...
 
template<class MESSAGE >
so_5::timer_thread::timer_id_ref_t schedule_timer (const mbox_ref_t &mbox, unsigned int delay_msec, unsigned int period_msec)
 Запланировать таймерное событие с пустым сообщением. Подробнее...
 
template<class MESSAGE >
void single_timer (std::unique_ptr< MESSAGE > msg, const mbox_ref_t &mbox, unsigned int delay_msec)
 Запланировать единичное таймерное событие, которое нельзя отменить. Подробнее...
 
template<class MESSAGE >
void single_timer (const mbox_ref_t &mbox, unsigned int delay_msec)
 Запланировать единичное таймерное событие, которое нельзя отменить, с пустым сообщением. Подробнее...
 
Работа со слоями.
template<class SO_LAYER >
SO_LAYER * query_layer (throwing_strategy_t throwing_strategy=THROW_ON_ERROR) const
 Получить указатель на требумый слой.
 
template<class SO_LAYER >
ret_code_t add_extra_layer (std::unique_ptr< SO_LAYER > layer_ptr, throwing_strategy_t throwing_strategy=THROW_ON_ERROR)
 Добавить дополнительный слой.
 
Запуск, инициализация и остановка.

Запустить среду SO_5.

ret_code_t run (throwing_strategy_t throwing_strategy=THROW_ON_ERROR)
 
virtual void init ()=0
 Инициализировать среду SO. Метод вызывается тогда, когда среда уже запущена. Подробнее...
 
void stop ()
 Завершить выполнение среды SO_5.
 

Закрытые члены

so_environment_tself_ref ()
 Получить ссылку на себя. Подробнее...
 
so_5::timer_thread::timer_id_ref_t schedule_timer (const type_wrapper_t &type_wrapper, const message_ref_t &msg, const mbox_ref_t &mbox, unsigned int delay_msec, unsigned int period_msec=0)
 Запланировать таймерное событие. Подробнее...
 
void single_timer (const type_wrapper_t &type_wrapper, const message_ref_t &msg, const mbox_ref_t &mbox, unsigned int delay_msec)
 Запланировать единичное таймерное событие, которое нельзя отменить. Подробнее...
 
so_layer_tquery_layer (const type_wrapper_t &type) const
 Получить слой.
 
ret_code_t add_extra_layer (const type_wrapper_t &type, const so_layer_ref_t &layer, throwing_strategy_t throwing_strategy)
 Добавить дополнительный слой.
 
ret_code_t remove_extra_layer (const type_wrapper_t &type, throwing_strategy_t throwing_strategy)
 Изьять дополнительный слой. Подробнее...
 

Закрытые данные

impl::so_environment_impl_tm_so_environment_impl
 Реализация среды so_5.
 

Подробное описание

Среда выполнения SObjectizer.

Среда выполнения SObjectizer предоставляет необходимую для агентов инфраструктуру. Она является фундаментом, на котором работают SObjectizer агенты.

Для создания и запуска SObjectizer Environment предполагается, что прикладной программист создает собственный класс наследуясь от so_environment_t и переопределяет метод so_environment_t::init(). Внутри этого метода программист определяет логику начала работы SObjectizer Environment, например, регистрация первоначальных коопераций и отправку инициализируеющих сообщений. В момент вызова init() SObjectizer Environment уже успешно инициализировал и запустил необходимую инфраструктуру, иначе до вызова init() дело не дойдет.

Для непосредственного запуска SObjectizer Environment служит метод so_environment_t::run(), который блокирует вызывающую нить на протяжении всего времени работы SObjectizer. Если ошибок не произошло, то метод so_environment_t::run() возвращает 0. Если во время работы SObjectizer Environment произошла ошибка, то вернет ее код или выбросит исключение. Это зависит от параметра throwing_strategy (so_5::throwing_strategy_t).

Для остановки работы SObjectizer Environment служит метод so_environment_t::stop(). Вызов so_environment_t::stop() только инициирует завершение работы SObjectizer Environment. Этот метод инициирует дерегистрацию всех коопераций. А когда все кооперации будут дерегистрированы, будет завершена работы внутренних компонент SObjectizer Environment. После этого работа SObjectizer будет завершена.

Во время работы SObjectizer Environment предоставляет следующие три группы прикладных методов:

Методы работы с mbox-ами.

SObjectizer Environment позволяет создавать безымянные mbox-ы с ресурсами синхронизации из пула или указанных пользователем, или также именные mbox, список которых ведет SObjectizer Environment.

Для создания mbox-ов служат методы so_environment_t::create_local_mbox(). Все они возвращают объект класса mbox_ref_t, который является указателем с подсчетом ссылок на объект класса mbox_t. Уничтожение безымянных mbox-ов происходит само собой, когда ссылок на него не остается. Именованные mbox-ы же хранятся в SObjectizer Environment, что дает постоянную ссылку на mbox. Для того чтобы изъять именованный mbox из этого списка, служит метод so_environment_t::destroy_mbox(). Этот метод исключает именованный mbox из списка и, если на него больше никто не ссылается, то он будет уничтожен.

Заметки
Если после исключение именнованный mbox остается, например, у какого-либо агента, а затем создается именованный mbox с таким же именем то это это будут разные mbox-ы. И сообщения, посылаемые через один mbox, не будут передаваться подписчикам другого.

Методы работы с кооперациями.

Кооперации можно создавать с помощью методов so_environment_t::create_coop(), для регистрации кооперации служит метод so_environment_t::register_coop(), а для дерегистрации кооперации служит метод so_environment_t::deregister_coop().

Методы отправки отложенных и периодических сообщений

Отправка отложенного и периодического сообщения называется таймерным событием. Механизм таймерных событий позволяет не только заводить, но и отменять таймерные события. В случае отложенного сообщения оно не будет отправлено, если, конечно, оно еще не было отправлено, а в случае периодического сообщения – отправка его будет прекращена. Для создания таймерных событий служит метод so_environment_t::schedule_timer(), который имеет две версии, первая подразумевает, что передается реальный экземпляр сообщения, а второй предусматривает только тип сообщения без реального экземпляра сообщения. so_environment_t::schedule_timer() возвращают таймерный идентификатор — объект типа so_5::timer_thread::timer_id_ref_t, который хранит данные, необходимые для отмены таймерного события. А отменить таймерное событие можно либо с помощью метода so_5::timer_thread::timer_id_ref_t::release(), либо оно будет уничтожено автоматически, если все ссылки на таймерное событие уничтожены.

В некоторых случаях есть необходимость отправить отложенное сообщение, которое ни в каких случаях не требует отмены, но so_environment_t::schedule_timer() требует запоминать таймерный идентификатор, в противном случае, отправка отложенного сообщения будет тут же отменена. Чтобы избежать хранения таймерного идентификатора в таких случаях в SObjectizer Environment предусмотрен метод so_environment_t::single_timer(), который планирует отложенную отправку сообщения, для которой не надо хранить таймерный идентификатор.

Примеры:
mbapi_4/binary_messages, mbapi_4/ping, mbapi_4/stages, so_5/chstate, so_5/coop_listener, so_5/disp, so_5/exception_handler, so_5/exception_logger, so_5/hello_all, so_5/hello_delay, so_5/hello_evt_handler, so_5/hello_periodic, so_5/hello_world, so_5/layer, so_5/mboxes, so_5_transport/raw_channe/tcp_srv и so_5_transport/raw_channel/tcp_cln.

Конструктор(ы)

so_5::rt::so_environment_t::so_environment_t ( const so_environment_params_t so_environment_params)
explicit
Аргументы
so_environment_paramsПараметры среды SObjectizer.
Примеры:
so_5/mboxes.

Методы

agent_coop_unique_ptr_t so_5::rt::so_environment_t::create_coop ( const nonempty_name_t name)
agent_coop_unique_ptr_t so_5::rt::so_environment_t::create_coop ( const nonempty_name_t name,
disp_binder_unique_ptr_t  disp_binder 
)

Создать кооперацию.

По умолчанию агенты кооперации привязываются к диспетчеру с помощью disp_binder.

Используется для тех агентов, которые добавляютяс к кооперации без явного указания привязки к диспетчеру.

so_5::rt::agent_coop_unique_ptr_t coop = so_env.create_coop(
so_5::rt::nonempty_name_t( "some_coop" ),
"active_group",
"some_active_group" ) );
// Агент будет привязан к деспетчеру активных групп "active_group"
// и будет работать на нити активной группы "some_active_group"
coop->add_agent(
so_5::rt::agent_ref_t( new a_some_agent_t( env ) ) );
Аргументы
nameИмя кооперации.
disp_binderПривязка агентов к диспетчеру, используемая по умолчанию для агентов кооперации.

Перекрестные ссылки so_5::rt::agent_coop_t::create_coop() и so_environment_impl().

mbox_ref_t so_5::rt::so_environment_t::create_local_mbox ( )

Создать безымянный mbox.

Мутекс для синхронизации берется из общего пула.

Примеры:
mbapi_4/ping, mbapi_4/stages и so_5/layer.

Перекрестные ссылки m_so_environment_impl.

Используется в gemont_2::impl::gemont_layer_impl_t::gemont_layer_impl_t() и so_sysconf_4::impl::so_sysconf_layer_impl_t::start().

mbox_ref_t so_5::rt::so_environment_t::create_local_mbox ( const nonempty_name_t mbox_name)

Создать именованный mbox.

Если mbox-а с таким именем нет, то он создается. Если же такой mbox уже был создан, то просто возвращается сылка на него. Мутекс для синхронизации берется из общего пула.

Аргументы
mbox_nameИмя mbox-а.

Перекрестные ссылки m_so_environment_impl.

mbox_ref_t so_5::rt::so_environment_t::create_local_mbox ( std::unique_ptr< ACE_RW_Thread_Mutex >  lock_ptr)

Создать безымянный mbox, мутекс для синхронизации создается пользователем.

Есть и особые случаи, когда надо обеспечить, чтобы mbox синхронизировался без параллельного использования в тех же целях другими mbox-ами. В таких случаях, создавая mbox, можно указать собственный динамически созданный мутекс (ACE_RW_Thread_Mutex).

Аргументы
lock_ptrМутекс созданный пользователем.

Перекрестные ссылки m_so_environment_impl.

mbox_ref_t so_5::rt::so_environment_t::create_local_mbox ( const nonempty_name_t mbox_name,
std::unique_ptr< ACE_RW_Thread_Mutex >  lock_ptr 
)

Создать именованный mbox.

Если mbox-а с таким именем нет, то он создается. Если же такой mbox уже был создан, то просто возвращается сылка на него. Мутекс для синхронизации создается пользователем.

Аргументы
mbox_nameИмя mbox-а.
lock_ptrМутекс созданный пользователем

Перекрестные ссылки m_so_environment_impl.

ret_code_t so_5::rt::so_environment_t::deregister_coop ( const nonempty_name_t name,
throwing_strategy_t  throwing_strategy = DO_NOT_THROW_ON_ERROR 
)

Дерегистрировать кооперацию.

При дерегистрации SObjectizer Environment проверяет наличие кооперации в словаре зарегистрированных коопераций и, если она находится, то инициирует ее дерегистрацию.

Важно понимать, что дерегистрация кооперации не значит, что ее агенты немедленно перестают работать, в этот момент агенты уведомляются, что они дерегистрируются. Получив такое уведомление, агенты перестают принимать новые заявки на обработку сообщений. И только когда агенты обработают локальную очередь событий до конца, они уведомят об этом кооперацию. Кооперация, в свою очередь, приполучении сигнала от всех своих агентов, уведомляет об этом SObjectizer, который затем на отдельной служебной нити окончательно дерегистрирует кооперацию.

После окончательной дерегистрации кооперации, агенты отвязываются от диспетчеров. После этого кооперация удаляется из словаря зарегистрированных коопераций.

Аргументы
nameИмя дерегистрируемой кооперации.
throwing_strategyФлаг - бросать ли исключение в случае ошибки.

Перекрестные ссылки so_5::rt::impl::so_environment_impl_t::deregister_coop() и m_so_environment_impl.

Используется в so_sysconf_4::coop_handler_t::dereg(), so_sysconf_4::coop_factory_t::dereg() и so_5_transport::a_server_base_t::so_handle_create_server_socket_result().

virtual void so_5::rt::so_environment_t::init ( )
pure virtual

Инициализировать среду SO. Метод вызывается тогда, когда среда уже запущена.

Внимание
Для того чтобы комманды на остановку среды Sobjectizer (метод stop()) возымели действие необходимо чтобы работа init() завершилась. В противном случае управляющая нить среды Sobjectizer, остается внутри init(), и не может приступить к ожиданию завершения работы, а соответственно дождаться его и начать завершение работы Sobjectizer. Например, если в init() сначала регистрируется кооперация, ее агенты начинают работать на своих диспетчерах рабочих нитей, а init() далее начинает бесконечный диалог с пользователем. Тогда даже если како-либо агент вызовет so_environment_t::stop(), то среда Sobjectizer продолжит работать в том же режиме, что и до этого, оставаясь полностью рабочей.

Замещается в so_sysconf_4::ntservice::ntservice_so_environment_t.

Примеры:
so_5/mboxes.

Используется в so_5::rt::impl::so_environment_impl_t::run().

dispatcher_ref_t so_5::rt::so_environment_t::query_named_dispatcher ( const std::string &  disp_name)

Получить именованный диспетчер.

Возвращает
Если диспетчер с таким именем есть, то вернется dispatcher_ref_t, который указывает на него, в противном случае вернется dispatcher_ref_t на 0.
Аргументы
disp_nameИмя диспетчера.

Перекрестные ссылки m_so_environment_impl и so_5::rt::impl::so_environment_impl_t::query_named_dispatcher().

ret_code_t so_5::rt::so_environment_t::register_coop ( agent_coop_unique_ptr_t  agent_coop,
throwing_strategy_t  throwing_strategy = THROW_ON_ERROR 
)

Зарегистрировать кооперацию.

При регистрации агенты сначала привязываются к кооперации, после этого агенты кооперации знают в какую кооперацию они входят. Затем SObjectizer Environment проверяет: является ли имя кооперации уникальным и, если имя не уникальное, то это приводит к ошибке. Если имя уникальное, то дальше осуществляется определение агентов, у них вызывается метод agent_t::so_define_agent(), что позволяет агенту подписаться на сообщения, еще до того как агент привязан к определенной рабочей нити. И в последнюю очередь происходит привязка агентов к их диспетчерам. Если все агенты успешно привязались к своим диспетчерам, то кооперация становится успешно зарегистрированной и добавляется в словарь зарегистрированных коопераций. В случае успешной регистрации register_coop вернет 0.

Аргументы
agent_coopКооперация, агентов которой надо зарегистрировать.
throwing_strategyФлаг - бросать ли исключение в случае ошибки.
Примеры:
mbapi_4/binary_messages, mbapi_4/ping, mbapi_4/stages, so_5/chstate, so_5/coop_listener, so_5/disp, so_5/exception_handler, so_5/exception_logger, so_5/hello_all, so_5/hello_delay, so_5/hello_evt_handler, so_5/hello_periodic, so_5/hello_world, so_5/layer, so_5/mboxes, so_5_transport/raw_channe/tcp_srv и so_5_transport/raw_channel/tcp_cln.

Перекрестные ссылки m_so_environment_impl и so_5::rt::impl::so_environment_impl_t::register_coop().

Используется в so_sysconf_4::single_instance::simple_handler_t::reg(), so_sysconf_4::ochannel::coop_factory_t::reg(), so_sysconf_4::ichannel::coop_factory_t::reg(), so_sysconf_log_3::hard_error_detector::coop_handler_t::reg(), so_sysconf_log_3::sysconf::coop_handler_t::reg(), so_sysconf_4::breakflag_handler::coop_handler_t::reg() и so_sysconf_log_3::error_msg_extractor::coop_factory_t::reg_backend_keeper().

ret_code_t so_5::rt::so_environment_t::remove_extra_layer ( const type_wrapper_t type,
throwing_strategy_t  throwing_strategy 
)
private

Изьять дополнительный слой.

Аргументы
typeТип слоя.
ret_code_t so_5::rt::so_environment_t::run ( throwing_strategy_t  throwing_strategy = THROW_ON_ERROR)
Аргументы
throwing_strategyФлаг - бросать ли исключение в случае ошибки.

Перекрестные ссылки m_so_environment_impl и so_5::rt::impl::so_environment_impl_t::run().

Используется в so_sysconf_4::ntservice::run_sobjectizer().

template<class MESSAGE >
so_5::timer_thread::timer_id_ref_t so_5::rt::so_environment_t::schedule_timer ( std::unique_ptr< MESSAGE > &  msg,
const mbox_ref_t mbox,
unsigned int  delay_msec,
unsigned int  period_msec 
)
inline

Запланировать таймерное событие.

Аргументы
msgСообщение.
mboxMbox, на который надо отсылать сообщение.
delay_msecЗадержка перед первой отправкой сообщения.
period_msecПериод отправки сообщений. Для отложенных сообщений period_msec равно 0.

Используется в mbapi_4::comm::a_mbapi_incoming_channel_t::check_sync_necessity(), gemont_2::a_retranslator_base_t::so_define_agent(), so_sysconf_4::breakflag_handler::a_handler_t::so_evt_start() и mbapi_4::comm::a_mbapi_outgoing_channel_t::so_handle_client_connected().

template<class MESSAGE >
so_5::timer_thread::timer_id_ref_t so_5::rt::so_environment_t::schedule_timer ( std::unique_ptr< MESSAGE > &&  msg,
const mbox_ref_t mbox,
unsigned int  delay_msec,
unsigned int  period_msec 
)
inline

Запланировать таймерное событие.

Аргументы
msgСообщение.
mboxMbox, на который надо отсылать сообщение.
delay_msecЗадержка перед первой отправкой сообщения.
period_msecПериод отправки сообщений. Для отложенных сообщений period_msec равно 0.
template<class MESSAGE >
so_5::timer_thread::timer_id_ref_t so_5::rt::so_environment_t::schedule_timer ( const mbox_ref_t mbox,
unsigned int  delay_msec,
unsigned int  period_msec 
)
inline

Запланировать таймерное событие с пустым сообщением.

Аргументы
mboxMbox, на который надо отсылать сообщение.
delay_msecЗадержка перед первой отправкой сообщения.
period_msecПериод отправки сообщений. Для отложенных сообщений period_msec равно 0.
so_5::timer_thread::timer_id_ref_t so_5::rt::so_environment_t::schedule_timer ( const type_wrapper_t type_wrapper,
const message_ref_t msg,
const mbox_ref_t mbox,
unsigned int  delay_msec,
unsigned int  period_msec = 0 
)
private

Запланировать таймерное событие.

Аргументы
type_wrapperТип сообщения.
msgСообщение.
mboxmbox на который надо отсылать сообщение.
delay_msecЗадержка перед первой отправкой сообщения.
period_msecПериод отправки сообщений, для отложенных сообщений period_msec == 0.

Перекрестные ссылки m_so_environment_impl и so_5::rt::impl::so_environment_impl_t::schedule_timer().

so_environment_t & so_5::rt::so_environment_t::self_ref ( )
private

Получить ссылку на себя.

Служит для инициализации внутренних переменных в конструкторе so_environment_t, конструктор которых требует указать ссылку на so_environment_t. Это позволяет избежать предупреждений компилятора об использовании this.

template<class MESSAGE >
void so_5::rt::so_environment_t::single_timer ( std::unique_ptr< MESSAGE >  msg,
const mbox_ref_t mbox,
unsigned int  delay_msec 
)
inline

Запланировать единичное таймерное событие, которое нельзя отменить.

Аргументы
msgСообщение.
mboxMbox, на который надо отсылать сообщение.
delay_msecЗадержка перед отправкой сообщения.
Примеры:
so_5/layer.

Используется в so_5_transport::a_client_transport_agent_t::do_reconnect() и so_5_transport::a_client_transport_agent_t::on_lost().

template<class MESSAGE >
void so_5::rt::so_environment_t::single_timer ( const mbox_ref_t mbox,
unsigned int  delay_msec 
)
inline

Запланировать единичное таймерное событие, которое нельзя отменить, с пустым сообщением.

Аргументы
mboxMbox, на который надо отсылать сообщение.
delay_msecЗадержка перед отправкой сообщения.
void so_5::rt::so_environment_t::single_timer ( const type_wrapper_t type_wrapper,
const message_ref_t msg,
const mbox_ref_t mbox,
unsigned int  delay_msec 
)
private

Запланировать единичное таймерное событие, которое нельзя отменить.

Аргументы
type_wrapperТип сообщения.
msgСообщение.
mboxmbox на который надо отсылать сообщение.
delay_msecЗадержка перед отправкой сообщений.

Перекрестные ссылки m_so_environment_impl и so_5::rt::impl::so_environment_impl_t::single_timer().


Документация по SObjectizer v.5.1 'Джимара'. Последние изменения: Ср 15 Май 2013 12:56:23. Создано системой  doxygen1.8.3.1 Intervale SourceForge.net Logo