SObjectizer
5.1
|
Базовый класс агентов. Подробнее...
Открытые члены | |
agent_t (so_environment_t &env) | |
Конструктор агента. Подробнее... | |
const agent_t * | self_ptr () const |
Получить указатель на себя. Подробнее... | |
virtual void | so_evt_start () |
Начальное событие агента. Подробнее... | |
virtual void | so_evt_finish () |
Завершающее событие агента. Подробнее... | |
const state_t & | so_current_state () const |
Получить ссылку на текущее состояние. | |
const std::string & | so_coop_name () const |
Имя кооперации, к которой принадлежит агент. Подробнее... | |
void | so_add_nondestroyable_listener (agent_state_listener_t &state_listener) |
Добавить агенту слушателя, время жизни которого агент не контролирует. | |
void | so_add_destroyable_listener (agent_state_listener_unique_ptr_t state_listener) |
Добавить агенту слушателся, владение которым передается агенту. | |
so_environment_t & | so_environment () |
Получить ссылку на среду SO к которой принадлежит агент. Подробнее... | |
Открытые статические члены | |
static void | call_push_event (agent_t &agent, const event_caller_block_ref_t &event_handler_caller, const message_ref_t &message) |
Поставить в очередь событие для выполнения агентом. Подробнее... | |
static void | call_next_event (agent_t &agent) |
Инициировать выполнение очередного события. Подробнее... | |
static void | call_bind_to_disp (agent_t &agent, dispatcher_t &disp) |
Привязать агента к диспетчеру. Подробнее... | |
Защищенные члены | |
bool | so_was_defined () const |
Был ли агент определен? Подробнее... | |
const state_t & | so_default_state () const |
Работа с состояниями. Подробнее... | |
ret_code_t | so_change_state (const state_t &new_state, throwing_strategy_t throwing_strategy=THROW_ON_ERROR) |
Сменить состояние. Подробнее... | |
subscription_bind_t | so_subscribe (const mbox_ref_t &mbox_ref) |
Подписка и отписка от сообщения. Подробнее... | |
subscription_unbind_t | so_unsubscribe (const mbox_ref_t &mbox_ref) |
Создать объект для изьятия подписки. Подробнее... | |
virtual void | so_define_agent () |
Первоначальная инициализация агента. Подробнее... | |
Закрытые типы | |
typedef std::map < subscription_key_t, impl::message_consumer_link_t * > | consumers_map_t |
Тип карта привязок к обработчикам событий. | |
Закрытые члены | |
agent_ref_t | create_ref () |
Получить ссылку на агент. Внутренний метод SO. Вызывается только тогда - когда гарантированно агент еще нужен и его кто-то держит по ссылке. | |
void | bind_to_coop (agent_coop_t &coop) |
Внедрение агента в действующий SO Runtime. Подробнее... | |
void | bind_to_environment (impl::so_environment_impl_t &env_impl) |
Привязать агента к среде so_5. Подробнее... | |
void | bind_to_disp (dispatcher_t &disp) |
Привязать агента к диспетчеру. Подробнее... | |
void | define_agent () |
Внутренний метод определения агента. Подробнее... | |
void | undefine_agent () |
Метод изьятия агента из системы. Подробнее... | |
ret_code_t | create_event_subscription (const type_wrapper_t &type_wrapper, mbox_ref_t &mbox_ref, const event_handler_caller_ref_t &ehc, throwing_strategy_t throwing_strategy) |
Добавление/удаление привязок для обработки сообщений. Подробнее... | |
ret_code_t | destroy_event_subscription (const type_wrapper_t &type_wrapper, mbox_ref_t &mbox_ref, const event_handler_caller_ref_t &ehc, throwing_strategy_t throwing_strategy) |
Уничтожить привязку между агентом и mbox-ом для обработки сообщений. Подробнее... | |
void | destroy_all_subscriptions () |
Уничтожить все подписки. | |
void | push_event (const event_caller_block_ref_t &event_handler_caller, const message_ref_t &message) |
Постановка событий в очередь и их выполнение. Подробнее... | |
void | exec_next_event () |
Выполнить очередное событие. Подробнее... | |
Закрытые члены inherited from so_5::rt::atomic_refcounted_t | |
atomic_refcounted_t () | |
Конструктор по умолчанию. Устанавливает количество ссылок в 0. | |
void | inc_ref_count () |
Увеличить количество ссылок. | |
unsigned long | dec_ref_count () |
Уменьшить количество ссылок. Подробнее... | |
Закрытые данные | |
const state_t | m_default_state |
Состояние по умолчанию. | |
const state_t * | m_current_state_ptr |
Текущее состояние агента. | |
bool | m_was_defined |
Был ли агент определен. | |
std::unique_ptr < impl::state_listener_controller_t > | m_state_listener_controller |
Контроллер слушателей агента. | |
consumers_map_t | m_event_consumers_map |
Потребители сообщения, которые являются обработчиками событий. | |
std::unique_ptr < impl::local_event_queue_t > | m_local_event_queue |
Локальная очередь событий. | |
impl::so_environment_impl_t * | m_so_environment_impl |
Среда so_5 которой принадлежит агент. | |
dispatcher_t * | m_dispatcher |
Диспетчер который занимается вызывом агента. Подробнее... | |
agent_coop_t * | m_agent_coop |
Кооперация которой принадлежит агент. | |
bool | m_is_coop_deregistered |
Флаг помечена ли кооперация, как удаляемая? | |
Друзья | |
class | subscription_bind_t |
class | subscription_unbind_t |
class | agent_ref_t |
class | agent_coop_t |
Базовый класс агентов.
Либой агент в SObjectizer-е должен быть производным от agent_t.
Базовый класс агента предоставляет различные методы, которые можно выделить в следующие основные группы:
Методы для взаимодействия с SObjectizer.
Метод so_5::rt::agent_t::so_environment() служит для получения доступа к SObjectizer Environment, а следовательно и ко всем методам SObjectizer Environment. Обращаться к методу можно сразу после создания агента, потому что агент привязывается к SObjectizer Environment в конструкторе базового класса so_5::rt::agent_t.
Хук-методы.
В базовом классе агента определены хук-методы для обработки различных ситуаций, которые по умолчанию ничего не делают.
Метод определения агента – agent_t::so_define_agent(), который вызывается до того как агент начнет работать в SO, т.е. до того, как начнется его работа на рабочей нити. Вызов этого метода осуществляется в процессе регистрации агента. Служит для начальной подписки агента на сообщения.
Во время жизненного цикла агента можно выделить два события: начала работы агента (когда кооперация успешно зарегистрирована и все агенты привязаны к диспетчерам) и завершения работы агента, когда кооперация дерегистрируется и агент завершил обработку последней заявки на обработку сообщения. Для обработки начала работы агента и завершения работы агента служат следующие хук-методы: agent_t::so_evt_start() и agent_t::so_evt_finish(). О вызове этих методов заботится SObjectizer, а пользователю остается только определить логику работы этих методов.
Методы подписки на сообщения и отмены подписок.
Механизм обработчиков сообщений строится на понятиях сообщения, mbox-а (ящик сообщений), обработчика сообщения (метода агента с особой сигнатурой) и на понятии состояния агента.
Обработчиком сообщения может считаться любой метод агента с сигнатурой аналогичной следующей:
Где evt_handler
— имя обработчика события, а MESSAGE
— тип сообщения.
Класс so_5::rt::event_data_t является оберткой над указателем на объект типа MESSAGE
, который предоставляет доступ к объекту аналогично std::unique_ptr
. Причем самого объекта может и не существовать, когда отправитель сообщения не имеет намерения отправлять в сообщении никакой дополнительной информации, кроме типа сообщения, в таком случае сообщение представляет собой сигнал определенного типа и ничего более.
Подписка агента на сообщения осуществляется с помощью метода so_5::rt::agent_t::so_subscribe(). В результате создается объект класса so_5::rt::subscription_bind_t, который уже знает агента подписчика и mbox, к которому происходит подписка, а также в качестве состояния подписки выбрано состояние агента по умолчанию.
Методы работы с состояниями агента
Для смены состояния агента служит метод so_5::rt::agent_t::so_change_state(). Ошибка, при смене состояния, может возникнуть только тогда, когда производится попытка перевести агента в состояние, которым он не владеет. В некоторых случаях нужно определять моменты смены состояния агента. Например, при создании средств мониторинга приложения. Для этих случаев предназначены "слушатели"состояния агента. Агенту может быть назначено любое количество "слушателей". Для добавления слушателя, владение которым контролирует прикладной программист, служит метод so_5::rt::agent_t::so_add_nondestroyable_listener(). Для добавления слушателя, владение которым передается агенту, служит метод so_5::rt::sgent_t::so_add_destroyable_listener().
|
explicit |
Конструктор агента.
При создании объекта-агента, он в обязательном порядке должен быть привязан к SObjectizer Environment, и эта привязка не может быть изменена в дальнейшем.
env | Среда SO, для которой создается агент. |
Перекрестные ссылки bind_to_environment() и so_5::rt::so_environment_t::so_environment_impl().
|
private |
Внедрение агента в действующий SO Runtime.
Привязать агента к кооперации.
Инициализирует внутренний указатель на кооперацию, а также взводит флаг что кооперация, которой принадлежит агент не является помеченной на дерегистрацию.
coop | Кооперация агентов. |
Перекрестные ссылки m_agent_coop и m_is_coop_deregistered.
|
private |
Привязать агента к диспетчеру.
Определяет диспетчер, который будет являться реальным диспетчером агента. Если в локальной очереди что-то накопилось, то рельному диспетчеру будет поставлен запрос на выполнение всего количества накопившихся событий ко времени начала работы агента на данном диспетчере.
disp | Диспетчер. |
Перекрестные ссылки create_ref(), m_dispatcher, m_local_event_queue, so_5::rt::dispatcher_t::put_event_execution_request() и so_5::rc_agent_is_already_bind_to_disp.
Используется в call_bind_to_disp().
|
inlineprivate |
Привязать агента к среде so_5.
Инициализирует внутренний указатель на среду SO и получает свою локальную очередь. Вызывается из конструктора агента.
env_impl | Среда so_5. |
Перекрестные ссылки so_5::rt::impl::so_environment_impl_t::create_local_queue(), so_5::rt::event_caller_block_t::insert(), m_local_event_queue и m_so_environment_impl.
Используется в agent_t().
|
inlinestatic |
Привязать агента к диспетчеру.
agent | Агент. |
disp | Диспетчер. |
Перекрестные ссылки bind_to_disp().
Используется в so_5::disp::active_group::impl::disp_binder_t::bind_agent(), so_5::disp::active_obj::impl::disp_binder_t::bind_agent() и so_5::disp::one_thread::impl::disp_binder_t::bind_agent().
|
inlinestatic |
Инициировать выполнение очередного события.
Метод который используется диспетчерами (рабочими нитями), для выполнения событий агента.
agent | Агент, у которого в очереди есть события, и очередное событие которого надо выполнить. |
Перекрестные ссылки exec_next_event().
Используется в so_5::disp::reuse::work_thread::work_thread_t::serve_demands_block().
|
inlinestatic |
Поставить в очередь событие для выполнения агентом.
Метод который используется для планирования событий агента.
event_handler_caller | Вызыватель обработичика. |
message | Экземпляр сообщения, которое будет параметром обработчика событие, которое должен будет выполнить агент. |
Перекрестные ссылки push_event().
Используется в so_5::rt::impl::message_consumer_link_t::dispatch().
|
private |
Добавление/удаление привязок для обработки сообщений.
Создать привязку между агентом и mbox-ом для обработки сообщений.
type_wrapper | Тип сообщения. |
mbox_ref | Ссылка на mbox. |
ehc | Вызыватель обработчика. |
throwing_strategy | Флаг - бросать ли исключение в случае ошибки. |
Перекрестные ссылки create_ref(), m_agent_coop, so_5::rt::agent_coop_t::m_agents_are_undefined, m_event_consumers_map, so_5::rt::agent_coop_t::m_lock, so_5::rt::mbox_t::subscribe_first_event_handler() и so_5::rt::mbox_t::subscribe_more_event_handler().
|
private |
Внутренний метод определения агента.
Вызывает so_define_agent(), после чего устанавливает флаг, что агент определен.
Перекрестные ссылки m_was_defined и so_define_agent().
|
private |
Уничтожить привязку между агентом и mbox-ом для обработки сообщений.
type_wrapper | Тип сообщения. |
mbox_ref | Mbox. |
ehc | Вызыватель обработчика. |
throwing_strategy | Флаг - бросать ли исключение в случае ошибки. |
Перекрестные ссылки m_agent_coop, m_event_consumers_map, so_5::rt::agent_coop_t::m_lock, so_5::rt::type_wrapper_t::query_type_info(), so_5::rc_no_event_handler_provided и so_5::rt::mbox_t::unsubscribe_event_handler().
Используется в so_5::rt::subscription_unbind_t::destroy_event_subscription().
|
private |
Выполнить очередное событие.
Должно вызываться только на контексте рабоченй нити.
Перекрестные ссылки so_5::rt::event_caller_block_t::call(), m_agent_coop, so_5::rt::impl::event_item_t::m_event_caller_block, m_is_coop_deregistered, m_local_event_queue и so_5::rt::impl::event_item_t::m_message_ref.
Используется в call_next_event().
|
private |
Постановка событий в очередь и их выполнение.
Поставить в очередь локальное событие.
event_handler_caller | Вызыватель обработичика |
message | Экземпляр сообщения. |
Перекрестные ссылки create_ref(), m_dispatcher, m_is_coop_deregistered, m_local_event_queue и so_5::rt::dispatcher_t::put_event_execution_request().
Используется в call_push_event().
const agent_t * so_5::rt::agent_t::self_ptr | ( | ) | const |
Получить указатель на себя.
Для того, чтобы избежать многословных предупреждений от компилятора, когда в списке инициализации требуется испобльзовать this. Например, при инициализации состояний агента.
|
protected |
Сменить состояние.
new_state | Новое состояние агента. |
throwing_strategy | Флаг - бросать ли исключение в случае ошибки. |
Перекрестные ссылки so_5::rt::state_t::is_target(), m_current_state_ptr, m_state_listener_controller и so_5::rc_agent_unknown_state.
Используется в so_5_transport::a_client_transport_agent_t::do_reconnect() и so_5_transport::a_server_transport_agent_t::so_evt_start().
const std::string & so_5::rt::agent_t::so_coop_name | ( | ) | const |
Имя кооперации, к которой принадлежит агент.
Перекрестные ссылки m_agent_coop, so_5::rt::agent_coop_t::query_coop_name() и so_5::rc_agent_has_no_cooperation.
Используется в so_5::disp::reuse::work_thread::work_thread_t::handle_exception() и so_5_transport::a_server_base_t::so_handle_create_server_socket_result().
|
protected |
Работа с состояниями.
Получить ссылку на состояние по умолчанию.
Перекрестные ссылки m_default_state.
Используется в so_5_transport::a_channel_base_t::a_channel_base_t().
|
protectedvirtual |
Первоначальная инициализация агента.
Метод определения агента.
Метод, который вызывается до того как агент начнет работать в SO, т.е. до того как начнется его работа на рабочей нити.
Переопределяется в so_5_transport::a_client_transport_agent_t, so_sysconf_log_3::sysconf::a_fatal_error_logger_t, gemont_2::a_retranslator_base_t, so_5_transport::a_channel_base_t, so_sysconf_4::breakflag_handler::a_handler_t, so_5_transport::a_transport_agent_t и so_5_transport::a_server_base_t.
Используется в define_agent().
so_environment_t & so_5::rt::agent_t::so_environment | ( | ) |
Получить ссылку на среду SO к которой принадлежит агент.
Метод служит для получения доступа к SObjectizer Environment, а следовательно и ко всем методам SObjectizer Environment. Это, например позволяет агенту создать кооперации лругих агентов.
Или, например, инициировать завершение работы.
Перекрестные ссылки m_so_environment_impl и so_5::rt::impl::so_environment_impl_t::query_public_so_environment().
Используется в mbapi_4::comm::a_mbapi_incoming_channel_t::check_sync_necessity(), so_5_transport::a_client_transport_agent_t::do_reconnect(), so_sysconf_4::breakflag_handler::a_handler_t::evt_check_time(), so_5_transport::a_client_transport_agent_t::on_lost(), gemont_2::a_retranslator_base_t::so_define_agent(), so_sysconf_log_3::sysconf::a_fatal_error_logger_t::so_define_agent(), so_sysconf_log_3::backend_keeper::a_backend_keeper_t::so_evt_finish(), so_sysconf_4::single_instance::a_single_instance_t::so_evt_start(), so_sysconf_4::breakflag_handler::a_handler_t::so_evt_start(), so_sysconf_log_3::backend_keeper::a_backend_keeper_t::so_evt_start(), mbapi_4::comm::a_mbapi_outgoing_channel_t::so_handle_client_connected(), so_5_transport::a_server_base_t::so_handle_create_server_socket_result() и so_sysconf_4::ichannel::a_failure_handler_t::so_handle_create_server_socket_result().
|
virtual |
Завершающее событие агента.
Т.е. то событие, которое гарантировано будет вызвано последним, до того момента, как агент будет отвязан к диспетчеру.
Метод играет роль своеобразного деструктора, в контексте SObjectizer, когда агент может выполнить какие-то действия на своей нити, еще до того, как будет вызван деструктор агента.
Переопределяется в so_5_transport::a_client_transport_agent_t, so_5_transport::a_server_transport_agent_t, so_sysconf_log_3::backend_keeper::a_backend_keeper_t, mbapi_4::comm::a_mbapi_incoming_channel_t, mbapi_4::comm::a_mbapi_outgoing_channel_t, so_5_transport::a_transport_agent_t и so_sysconf_4::single_instance::a_single_instance_t.
|
virtual |
Начальное событие агента.
Т.е. то событие, которое гарантировано будет вызвано первым, в тот момент когда, агент будет привязан к диспетчеру.
Метод играет роль своеобразного конструктора, в контексте SObjectizer, когда сначала конструируется сам объект агента, затем он привязывается к своему диспетчеру и начинает работу на нити диспетчера с вызова \с so_evt_start().
Переопределяется в so_5_transport::a_client_transport_agent_t, so_5_transport::a_server_transport_agent_t, so_sysconf_log_3::backend_keeper::a_backend_keeper_t, so_sysconf_4::breakflag_handler::a_handler_t, mbapi_4::comm::a_mbapi_incoming_channel_t, mbapi_4::comm::a_mbapi_outgoing_channel_t и so_sysconf_4::single_instance::a_single_instance_t.
|
protected |
Подписка и отписка от сообщения.
Создать объект для выполнения подписки.
mbox_ref | Mbox на сообщение которого подписывать. |
Используется в so_5_transport::a_server_base_t::so_define_agent(), so_5_transport::a_transport_agent_t::so_define_agent(), so_sysconf_4::breakflag_handler::a_handler_t::so_define_agent(), so_5_transport::a_channel_base_t::so_define_agent(), gemont_2::a_retranslator_base_t::so_define_agent(), so_sysconf_log_3::sysconf::a_fatal_error_logger_t::so_define_agent(), so_5_transport::a_client_transport_agent_t::so_define_agent(), mbapi_4::comm::a_mbapi_outgoing_channel_t::so_evt_start() и mbapi_4::comm::a_mbapi_incoming_channel_t::so_evt_start().
|
protected |
Создать объект для изьятия подписки.
mbox_ref | mbox от сообщений которого отписывать. |
|
protected |
Был ли агент определен?
Когда надо определить определен ли агент уже.
Перекрестные ссылки m_was_defined.
Используется в so_5_transport::a_channel_base_t::so_add_state_for_channel_events().
|
private |
Метод изьятия агента из системы.
Метод который изымает все подписки агента.
Перекрестные ссылки create_ref(), destroy_all_subscriptions(), so_5::rt::event_caller_block_t::insert(), m_dispatcher, m_is_coop_deregistered, m_local_event_queue и so_5::rt::dispatcher_t::put_event_execution_request().
|
private |
Диспетчер который занимается вызывом агента.
По умолчанию получает заглушку, которая ничего не делает, а просто поглащает вызовы постановки агента в очередь на вызов. После привязки агента к реальному диспетчеру сменить его нельзя, и при попытке это сделать произойдет ошибка.
Владение над m_dispatcher агент не имеет.
Используется в bind_to_disp(), push_event() и undefine_agent().
Документация по SObjectizer v.5.1 'Джимара'. Последние изменения: Ср 15 Май 2013 12:56:22. Создано системой 1.8.3.1 |