Проблема в том, что при использовании некоторых типов диспетчеров (с активными объектами, например) агент A успеет получить сообщение msg_start, создать TCP/IP соединение и отослать результат соединения до того, как агент B получит управление после вызова so_4::api::register_coop().
Этой проблемы не было бы, если бы агент B мог подписаться на сообщение агента A еще до создания агента A. Но в SObjectizer-е подписаться можно только на сообщения уже зарегистрированных агентов.
Для преодоления этого противоречия в v.4.2.6 введено понятие т.н. hook-ов подписки. Hook подписки -- это объект, реализующий интерфейс so_4::rt::subscr_hook_t, связанный с конкретной кооперацией агентов. При регистрации кооперации непосредственно перед осуществлением подписки агентов зарегистрированной кооперации (но уже после того, как агенты зарегистрированны в системном словаре SObjectizer-а) у этого объекта SObjectizer-ом вызывается метод so_4::rt::subscr_hook_t::hook().
Для приведенного примера с агентами A и B, агент B должен создать hook-и для подписки своих событий на сообщения агента A и связать эти hook-и с подчененной кооперацией. В результате агент B окажется подписанным на сообщения агента A еще до того, как агент A получит сообщение msg_start. Вне зависимости от типа используемого диспетчера.
Для упрощения использования hook-ов подписки в SObjectizer включен класс so_4::rt::def_subscr_hook_t и функции so_4::rt::def_subscr_hook(), которые позволяют использовать уже готовые типы hook-ов в наиболее распространенных случаях.
Пример использования hook-ов можно увидеть в sample/subscr_hook/main.cpp.
Документация по SObjectizer v.4.4 'Тебуломста'. Последние изменения: Thu Sep 18 10:26:48 2008. Создано системой 1.5.6 |