so_4: Версия 4.2.6. Упрощение подписки агентов

В предыдущих версиях SObjectizer-а для подписки события агента в основном использовались макросы SOL4_SUBSCR_*. Что при наличии большого количества событий в агенте приводило метод so_4::rt::so_on_subscription() к нечитабельному виду:
void
a_main_t::so_on_subscription()
{
  SOL4_SUBSCR_EVENT_START( evt_start, 0 )
    SOL4_SUBSCR_EVENT_MSG(
      so_4::rt::sobjectizer_agent_name(),
      "msg_start" )
  SOL4_SUBSCR_EVENT_FINISH_CERR()

  SOL4_SUBSCR_EVENT_START( evt_bind_ok, 0 )
    SOL4_SUBSCR_EVENT_MSG(
      tcp_agent_name(),
      "msg_bind_ok" )
  SOL4_SUBSCR_EVENT_FINISH_CERR()

  SOL4_SUBSCR_EVENT_START( evt_bind_fail, 0 )
    SOL4_SUBSCR_EVENT_MSG(
      tcp_agent_name(),
      "msg_bind_fail" )
  SOL4_SUBSCR_EVENT_FINISH_CERR()

  SOL4_SUBSCR_EVENT_START( evt_server_closed, 0 )
    SOL4_SUBSCR_EVENT_MSG(
      tcp_agent_name(),
      "msg_server_closed" )
  SOL4_SUBSCR_EVENT_FINISH_CERR()

  SOL4_SUBSCR_EVENT_START( evt_client_accepted, 0 )
    SOL4_SUBSCR_EVENT_MSG(
      tcp_agent_name(),
      "msg_client_accepted" )
  SOL4_SUBSCR_EVENT_FINISH_CERR()

  SOL4_SUBSCR_EVENT_START( evt_client_disconnected, 0 )
    SOL4_SUBSCR_EVENT_MSG(
      tcp_agent_name(),
      "msg_client_disconnected" )
  SOL4_SUBSCR_EVENT_FINISH_CERR()

  SOL4_SUBSCR_EVENT_START( evt_incomming_data, 0 )
    SOL4_SUBSCR_EVENT_MSG(
      tcp_agent_name(),
      "msg_incomming_data" )
  SOL4_SUBSCR_EVENT_FINISH_CERR()

  SOL4_SUBSCR_EVENT_START( evt_create_srvsock, 0 )
    SOL4_SUBSCR_EVENT_MSG_SELF(
      "msg_create_srvsock" )
  SOL4_SUBSCR_EVENT_FINISH_CERR()

  SOL4_SUBSCR_EVENT_START( evt_send_notify, 0 )
    SOL4_SUBSCR_EVENT_MSG_SELF(
      "msg_send_notify" )
  SOL4_SUBSCR_EVENT_FINISH_CERR()
}

В v.4.2.6 в класс so_4::rt::agent_t добавлены методы so_subscribe(), которые могут упростить подписку событий агентов. Приведенный выше пример с их помощью можно переписать следующим образом:

void
a_main_t::so_on_subscription()
{
  so_subscribe( "evt_start",
    so_4::rt::sobjectizer_agent_name(), "msg_start" );

  so_subscribe( "evt_bind_ok",
    tcp_agent_name(), "msg_bind_ok" );

  so_subscribe( "evt_bind_fail",
    tcp_agent_name(), "msg_bind_fail" );

  so_subscribe( "evt_server_closed",
    tcp_agent_name(), "msg_server_closed" );

  so_subscribe( "evt_client_accepted",
    tcp_agent_name(), "msg_client_accepted" );

  so_subscribe( "evt_client_disconnected",
    tcp_agent_name(), "msg_client_disconnected" );

  so_subscribe( "evt_incomming_data",
    tcp_agent_name(), "msg_incomming_data" );

  so_subscribe( "evt_create_srvsock", "msg_create_srvsock" );

  so_subscribe( "evt_send_notify", "msg_send_notify" );
}

По умолчанию, действие методов so_4::rt::agent_t::so_subscribe() аналогично макросам:

SOL4_SUBSCR_EVENT_START( event, priority )
  SOL4_SUBSCR_EVENT_MSG( owner, msg )
SOL4_SUBSCR_EVENT_FINISH_CERR()
Т.е., если в процессе подписки будет диагностирована ошибка, то сообщение об ошибке будет выведено в std::cerr. Если это не желательно, то в качестве аргумента err в метод so_4::rt::agent_t::so_subscribe() можно передать:
Документация по SObjectizer. Последние изменения: Thu Jan 12 10:52:50 2006. Создано системой  doxygen 1.4.6-NO
Hosted by uCoz