Если сообщение успешно диспетчеризировано, то экземпляр сообщения будет уничтожен SObjectizer-ом. В противном случае это должен сделать прикладной программист:
some_msg * p = new some_msg(); if( so_4::api::send_msg( agent_name, msg_name, p ) ) { // Сообщение не было отправлено! delete p; }
Очевидно, что в реальной работе невозможно заключить все обращения к so_4::api::send_msg() в операторы if. Именно поэтому в SObjectizer-е с самого начала существует класс so_4::rt::msg_auto_ptr_t, который берет на себя задачу уничтожения экземпляра сообщения в случае неудачной отсылки сообщения:
so_4::rt::msg_auto_ptr_t< some_msg > p( new some_msg() ); p.send( agent_name, msg_name );
Но, при использовании so_4::rt::msg_auto_ptr_t приходится писать довольно много кода:
so_4::rt::msg_auto_ptr_t< so_sysconf_2::a_shutdowner_t::msg_register > msg( new so_sysconf_2::a_shutdowner_t::msg_register( so_query_name() ) );
// Создание экземпляра сообщения. so_4::rt::msg_auto_ptr_t< so_sysconf_2::a_shutdowner_t::msg_register > msg( new so_sysconf_2::a_shutdowner_t::msg_register( so_query_name() ) ); // Отсылка сообщения. msg.send( so_sysconf_2::a_shutdowner_t::agent_name(), "msg_register" );
Добавленные в v.4.2.6 функции so_4::api::send_msg_safely() позволяют выполнить создание и отсылку экземляра сообщения одним обращением к SObjectizer API, если экземпляр сообщения полностью инициализируется в конструкторе:
// Отсылка сообщения. so_4::api::send_msg_safely( so_sysconf_2::a_shutdowner_t::agent_name(), "msg_register", // Создание экземпляра сообщения. new so_sysconf_2::a_shutdowner_t::msg_register( so_query_name() ) );
Документация по SObjectizer v.4.4 'Тебуломста'. Последние изменения: Thu Sep 18 10:26:48 2008. Создано системой 1.5.6 |