so_4: Версия 4.4.0. Контекст вызова message checker-ов

В SObjectizer существует возможность связывать с типами сообщений специальную функцию, называемую message checker. Задачей этой функции является проверка экземпляра сообщения на предмет корректности с точки зрения прикладной логики. Например, если есть сообщение:
struct msg_client_logged_in
  {
    // Идентификатор клиента.
    // Не может быть пустым.
    const std::string m_name;
    // Канал, через которое произошло подключение.
    // Не может быть пустым.
    const so_4::rt::comm_channel_t m_channel;
    ...
  };
Агент, который обрабатывает эти сообщения, должен быть защищен от получения сообщений, в которых значения полей m_name и m_channel пусты. Для этого сообщение msg_client_logged_in снабжается message checker-ом:
struct msg_client_logged_in
  {
    ...
    static bool
    check( const msg_client_logged_in * cmd )
      {
        // Сообщение должно содержать данные...
        return ( cmd != 0 &&
            // ...имя клиента не должно быть пустым...
            !cmd->m_name.empty() &&
            // ...идентификатор канала не может быть пустым...
            !cmd->m_channel.is_null() );
      }
  };
...
// ...где-то в описании класса агента для SObjectizer...
SOL4_MSG_START( msg_client_logged_in, a_some_agent_t::msg_client_logged_in )
  ...
  SOL4_MSG_CHECKER( a_some_agent_t::msg_client_logged_in::check )
SOL4_MSG_FINISH()
При наличии такого message checker-а SObjectizer гарантирует, что агент не получит сообщения, для которого message checker возвращает значение false.

До версии 4.4.0 SObjectizer вызывал message checker внутри so_4::api::send_msg() перед выполнением диспетчеризации сообщения. Т.е. сколько бы событий не было сгенерированно в результате send_msg(), message checker вызывался всего один раз на контексте той нити, на которой была вызвана функция send_msg().

В версии 4.4.0-beta6 изменился момент вызова message checker-а. Теперь он вызывается перед запуском сгенерированного сообщением события на контексте той нити, на которой производится запуск события. Запуск message checker-а производится для каждого события, сгенерированного данным сообщением. Это значит, что если сообщение привело к возникновению нескольких событий, то message checker будет вызван для каждого из них.

Такое положение вещей означает, что message checker должен быть thread safe. В идеале, message checker должен быть небольшой реентерабильной функцией без побочных эффектов, не нуждающейся в синхронизации.


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