1. Когда существует некий агент-маршрутизатор, создающий по мере необходимости подчиненных агентов. Например, маршрутизатор отслеживает подключение новых клиентов к серверному сокету и для каждого нового клиента создает прикладного агента для работы с клиентом. Проблема возникает, если агент-маршрутизатор существует не все время работы приложения, а переодически создается и уничтожается. При дерегистрации маршрутизатора бывает необходимо инициировать уничтожение всех созданных им агентов. Т.к. предыдущие версии SObjectizer-а были не в состоянии отслеживать подобные взаимоотношения между агентами, то маршрутизатору необходимо было самостоятельно вести список созданных им агентов и инициировать их дерегистрацию в своем методе so_4::agent_t::so_on_deregistration().
2. Когда агент, породивший еще одного агента, должен разделять со своим "потомком" общие данные. Например, агент-родитель владеет некоторым журналом, данные в который по каким-то внешним событиям помещает дочерний агент. Если агент-родитель и агент-потомок являются динамически созданными агентами, то возникает вопрос: кто будет отвечать за уничтожение объекта-журнала? Ведь при завершении работы SObjectizer-а порядок, в котором будут уничтожены агенты, не определен. Может оказаться, что агент-родитель и объект-журнал будут уничтожены, а агент-потомок еще будет существовать и пытаться поместить данные в объект-журнал. В предыдущих версиях SObjectizer-а выход состоял в подсчете ссылок на объект-журнал. Агенты увеличивали количество ссылок на объект-журнал в конструкторе и уменьшали в деструкторе. Объект-журнал уничтожался при обнулении количества ссылок.
Описанные выше проблемы возникали из-за того, что SObjectizer был не в состоянии отслеживать взаимосвязи между кооперациями агентов. Поэтому SObjectizer не мог гарантировать порядка, в котором кооперации (а значит и агенты) будут дерегистрироваться и уничтожаться.
Для преодоления описанных выше проблем в версии 4.2.7 введена поддержка взаимоотношений "родитель-потомок" для коопераций.
Каждая кооперация может иметь только одного предка (родителя) и произвольное количество потомков (дочерних коопераций). Дочерние кооперации, в свою очередь, могут иметь своих потомков. Их потомки -- своих потомков и т.д.
При наличии многоуровневых взаимосвязей SObjectizer гарантирует, что при дерегистрации самого верхнего предка, сначала будут дерегистрированы кооперации, у которых нет своих потомков. Затем будут дерегистрированы их непосредственные предки, затем их предки и т.д.
Тоже самое SObjectizer гарантирует и при нормальном завершении работы SObjectizer Run-Time. Только в этом случае SObjectizer не определяет порядка уничтожения коопераций, находящихся на одном уровне иерархии "родства".
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. Создано системой 1.5.6 |