Но на практике возникают задачи, в которых при разрыве основного соединения нужно перейти на резервный канал. В этом случае использование транспортных агентов 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. Создано системой 1.5.4 |