so_4: Версия 4.2.7. Дочерние кооперации

Введение

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

1. Когда существует некий агент-маршрутизатор, создающий по мере необходимости подчиненных агентов. Например, маршрутизатор отслеживает подключение новых клиентов к серверному сокету и для каждого нового клиента создает прикладного агента для работы с клиентом. Проблема возникает, если агент-маршрутизатор существует не все время работы приложения, а переодически создается и уничтожается. При дерегистрации маршрутизатора бывает необходимо инициировать уничтожение всех созданных им агентов. Т.к. предыдущие версии SObjectizer-а были не в состоянии отслеживать подобные взаимоотношения между агентами, то маршрутизатору необходимо было самостоятельно вести список созданных им агентов и инициировать их дерегистрацию в своем методе so_4::agent_t::so_on_deregistration().

2. Когда агент, породивший еще одного агента, должен разделять со своим "потомком" общие данные. Например, агент-родитель владеет некоторым журналом, данные в который по каким-то внешним событиям помещает дочерний агент. Если агент-родитель и агент-потомок являются динамически созданными агентами, то возникает вопрос: кто будет отвечать за уничтожение объекта-журнала? Ведь при завершении работы SObjectizer-а порядок, в котором будут уничтожены агенты, не определен. Может оказаться, что агент-родитель и объект-журнал будут уничтожены, а агент-потомок еще будет существовать и пытаться поместить данные в объект-журнал. В предыдущих версиях SObjectizer-а выход состоял в подсчете ссылок на объект-журнал. Агенты увеличивали количество ссылок на объект-журнал в конструкторе и уменьшали в деструкторе. Объект-журнал уничтожался при обнулении количества ссылок.

Описанные выше проблемы возникали из-за того, что SObjectizer был не в состоянии отслеживать взаимосвязи между кооперациями агентов. Поэтому SObjectizer не мог гарантировать порядка, в котором кооперации (а значит и агенты) будут дерегистрироваться и уничтожаться.

Для преодоления описанных выше проблем в версии 4.2.7 введена поддержка взаимоотношений "родитель-потомок" для коопераций.

Взаимоотношения между кооперациями

Начиная с версии 4.2.7 любой кооперации может быть назначена родительская кооперация. В этом случае SObjectizer гарантирует, что при дерегистрации родительской кооперации сначала будут дерегистрированы все ее дочерние кооперации. Применительно к динамически созданным кооперациям (см. so_4::rt::dyn_agent_coop_t) это означает, что дочерние кооперации и все содержащиеся в них агенты будут уничтожены до того, как будет дерегистрирована их родительская кооперация.

Каждая кооперация может иметь только одного предка (родителя) и произвольное количество потомков (дочерних коопераций). Дочерние кооперации, в свою очередь, могут иметь своих потомков. Их потомки -- своих потомков и т.д.

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

Тоже самое SObjectizer гарантирует и при нормальном завершении работы SObjectizer Run-Time. Только в этом случае SObjectizer не определяет порядка уничтожения коопераций, находящихся на одном уровне иерархии "родства".

Указание родительской кооперации

Для того, чтобы указать, что кооперация является потомком необходимо перед регистрацией кооперации указать имя ее предка посредством метода so_4::rt::agent_coop_t::set_parent_coop_name():
class a_parent_t : public so_4::rt::agent_t
{
  ...
  void
  evt_make_child()
  {
    // Создание динамической кооперации,
    // которая будет нашим потомком.
    so_4::rt::dyn_agent_coop_t * coop(
      new so_4::rt::dyn_agent_coop_t(
        new a_child_t( ... ) ) );
    coop->set_parent_coop_name(
      so_query_coop()->query_name() );
    // Регистрация кооперации.
    so_4::rt::dyn_agent_coop_helper_t h( coop );
    ...
  }
  ...
};

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


Документация по SObjectizer v.4.4 'Тебуломста'. Последние изменения: Thu Sep 18 10:26:48 2008. Создано системой  doxygen1.5.6 Intervale SourceForge.net Logo