SObjectizer
5.1
|
Среда выполнения SObjectizer. Подробнее...
Открытые члены | |
so_environment_t (const so_environment_params_t &so_environment_params) | |
impl::so_environment_impl_t & | so_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_t & | query_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_t & | self_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_t * | query_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_t * | m_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 из списка и, если на него больше никто не ссылается, то он будет уничтожен.
Методы работы с кооперациями.
Кооперации можно создавать с помощью методов 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(), который планирует отложенную отправку сообщения, для которой не надо хранить таймерный идентификатор.
|
explicit |
so_environment_params | Параметры среды SObjectizer. |
agent_coop_unique_ptr_t so_5::rt::so_environment_t::create_coop | ( | const nonempty_name_t & | name | ) |
Создать кооперацию.
Создается кооперация с заданным именем, с классом привязки агентов к диспетчеру SObjectizer по умолчанию.
name | Имя кооперации. |
Перекрестные ссылки so_5::rt::create_default_disp_binder().
Используется в 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().
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.
Используется для тех агентов, которые добавляютяс к кооперации без явного указания привязки к диспетчеру.
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.
Мутекс для синхронизации берется из общего пула.
Перекрестные ссылки 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().
|
pure virtual |
Инициализировать среду SO. Метод вызывается тогда, когда среда уже запущена.
Замещается в so_sysconf_4::ntservice::ntservice_so_environment_t.
Используется в 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 | ) |
Получить именованный диспетчер.
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 | Флаг - бросать ли исключение в случае ошибки. |
Перекрестные ссылки 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().
|
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().
|
inline |
Запланировать таймерное событие.
msg | Сообщение. |
mbox | Mbox, на который надо отсылать сообщение. |
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().
|
inline |
Запланировать таймерное событие.
msg | Сообщение. |
mbox | Mbox, на который надо отсылать сообщение. |
delay_msec | Задержка перед первой отправкой сообщения. |
period_msec | Период отправки сообщений. Для отложенных сообщений period_msec равно 0. |
|
inline |
Запланировать таймерное событие с пустым сообщением.
mbox | Mbox, на который надо отсылать сообщение. |
delay_msec | Задержка перед первой отправкой сообщения. |
period_msec | Период отправки сообщений. Для отложенных сообщений period_msec равно 0. |
|
private |
Запланировать таймерное событие.
type_wrapper | Тип сообщения. |
msg | Сообщение. |
mbox | mbox на который надо отсылать сообщение. |
delay_msec | Задержка перед первой отправкой сообщения. |
period_msec | Период отправки сообщений, для отложенных сообщений period_msec == 0. |
Перекрестные ссылки m_so_environment_impl и so_5::rt::impl::so_environment_impl_t::schedule_timer().
|
private |
Получить ссылку на себя.
Служит для инициализации внутренних переменных в конструкторе so_environment_t, конструктор которых требует указать ссылку на so_environment_t. Это позволяет избежать предупреждений компилятора об использовании this
.
|
inline |
Запланировать единичное таймерное событие, которое нельзя отменить.
msg | Сообщение. |
mbox | Mbox, на который надо отсылать сообщение. |
delay_msec | Задержка перед отправкой сообщения. |
Используется в so_5_transport::a_client_transport_agent_t::do_reconnect() и so_5_transport::a_client_transport_agent_t::on_lost().
|
inline |
Запланировать единичное таймерное событие, которое нельзя отменить, с пустым сообщением.
mbox | Mbox, на который надо отсылать сообщение. |
delay_msec | Задержка перед отправкой сообщения. |
|
private |
Запланировать единичное таймерное событие, которое нельзя отменить.
type_wrapper | Тип сообщения. |
msg | Сообщение. |
mbox | mbox на который надо отсылать сообщение. |
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. Создано системой 1.8.3.1 |