so_alt_channel_2: версия 2.0.0. Что такое so_alt_channel_2.

Идея каналов ввода-вывода в SObjectizer базируется на том, что каждый канал предназначен для соединения с одним конкретным узлом. Поскольку клиентские транспортные агенты в SObjectizer (so_4::rt::comm::a_sop_outgoing_channel_t, so_4::rt::comm::a_raw_outgoing_channel_t) работают с одним каналом, то и они предназначены для работы с одним узлом. Т.е. если соединение с удаленной стороной есть, то все хорошо. Если соединение рвется, то осуществляются попытки восстановить соединение только с этим узлом.

Но на практике возникают задачи, в которых при разрыве основного соединения нужно перейти на резервный канал. В этом случае использование транспортных агентов SObjectizer вызывает сложности. Можно, например, создавать нескольких агентов, по одному на каждое соединение, и управлять ими. Но это сложно. Ведь мало того, что нужно отслеживать сообщения msg_client_connected, msg_client_disconnected от нескольких агентов, так еще нужно контролировать, какой агент потерял соединение и какого агента нужно заставить установить новое содинение.

Более удобен вариант создания специального класса, реализующего интерфейс so_4::transport_layer::connector_controller_t. Такой класс мог бы получать в конструкторе список реальных connector_controller-ов, по одному на каждый канал. В методе connect() этот класс последовательно перебирал бы все фабрики, пока не установил бы соединение.

Имеено эта идея и является основой so_alt_channel_2: библиотека предоставляет интерфейс so_alt_channel_2::cyclic_connector_controller_t, который в своем методе connect() будет последовательно перебирать все зарегистрированные у него реальные connector_controller-ы.

Для использования cyclic_connector_controller_t необходимо:

so_alt_channel_2::cyclic_connector_controller_auto_ptr_t connector =
    so_alt_channel_2::create_cyclic_connector_controller( 15 );

// Для каждого IP-адреса из командной строки создается реальный
// connector_controller.
for( int i = 1; i < argc; ++i )
  connector->add_connector_controller(
      so_4::transport_layer::socket::create_connector_controller(
          argv[ i ] ) );

// Теперь можно создавать транспортный агент.
so_4::rt::comm::a_sop_outgoing_channel_t a_channel(
  "a_channel",
  so_4::transport_layer::connector_controller_auto_ptr_t( connector ),
  so_4::sop::create_all_enable_filter(),
  so_4::rt::comm::create_def_disconnect_handler( 5000, 1000 ) );

Документация по so_alt_channel_2 v.2.0.0. Последние изменения: Wed Oct 31 18:38:06 2007. Создано системой  doxygen1.5.4 Intervale SourceForge.net Logo