so_4: Версия 4.2.6. Упрощение отсылки сообщений

Экземплярами отсылаемых в SObjectizer-е сообщений должны быть динамически созданные объекты. Это означает, что кто-то должен их создавать и кто-то должен их уничтожать. За создание экземпляра сообщения отвечает прикладной программист.

Если сообщение успешно диспетчеризировано, то экземпляр сообщения будет уничтожен 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 приходится писать довольно много кода:

Добавленные в 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. Создано системой  doxygen1.5.6 Intervale SourceForge.net Logo