コード例 #1
0
ファイル: config_manager.cpp プロジェクト: wolfhead/minotaur
int ConfigManager::LoadClientRoutersConfig(tinyxml2::XMLElement* element, ClientRoutersConfig* config) {
  if (!element) {
    MI_LOG_WARN(logger, "ConfigManager::LoadClientRoutersConfig no element");
    return 0;
  }

  tinyxml2::XMLElement* router = element->FirstChildElement("router");
  while (router) {
    ClientRouterConfig router_config;
    XML_LOAD_STRING(router, "name", router_config.name, -1);
    XML_LOAD_STRING_DEFAULT(router, "router", router_config.router, "round");

    tinyxml2::XMLElement* client = router->FirstChildElement("client");
    while (client) {
      ClientConfig client_config;
      int tmp;
      XML_LOAD_STRING(client, "address", client_config.address, -1);
      XML_LOAD_INT(client, "timeout", &tmp, -1); 
      client_config.timeout = tmp;
      XML_LOAD_INT_DEFAULT(client, "heartbeat", &tmp, 0);
      client_config.heartbeat = tmp;
      XML_LOAD_INT(client, "count", &tmp, -1);
      client_config.count = tmp;

      router_config.clients.push_back(client_config);

      client = client->NextSiblingElement("client");
    }

    config->push_back(router_config);
    router = router->NextSiblingElement("router");
  }

  return 0;
}
コード例 #2
0
ファイル: io_handler.cpp プロジェクト: fanfeixiang/minotaur
void IOHandler::HandleIOMessageFailure(const EventMessage& message) {
  ProtocolMessage* protocol_message = message.GetProtocolMessage();
  if (protocol_message->direction == ProtocolMessage::kOutgoingRequest) {
    protocol_message->status = ProtocolMessage::kInternalFailure;
    if (!GetIOService()->GetServiceStage()->Send(protocol_message)) {
      MI_LOG_WARN(logger, "IOHandler::HandleIOMessageFailure send fail");
    }
  } else {
    message.Destroy();
  }
}
コード例 #3
0
void SyncClientChannel::OnDecodeMessage(ProtocolMessage* message) {
  ProtocolMessage* keeper_message = sequence_keeper_.Fetch();
  if (!keeper_message) {
    MI_LOG_WARN(logger, "SyncClientChannel::OnDecodeMessage keeper not found, might timeout"
        << ", client_channel:" << GetDiagnositicInfo());
    MessageFactory::Destroy(message);
    BreakChannel();
    return;
  } 

  if (keeper_message->type_id == MessageType::kHeartBeatMessage
      || keeper_message->direction == ProtocolMessage::kOneway) {
    MI_LOG_TRACE(logger, "SyncClientChannel::OnDecodeMessage heartbeat or oneway:" << *message);
    MessageFactory::Destroy(message);
    MessageFactory::Destroy(keeper_message);
    TryFireMessage();
    return;
  }

  message->status = ProtocolMessage::kStatusOK;
  message->direction = ProtocolMessage::kIncomingResponse;
  message->handler_id = keeper_message->handler_id;
  message->sequence_id = keeper_message->sequence_id;
  message->descriptor_id = GetDescriptorId();
  message->payload.data = keeper_message->payload.data;

  MI_LOG_TRACE(logger, "SyncClientChannel::OnDecodeMessage " << *message);

  MessageFactory::Destroy(keeper_message);

  if (!GetIOService()->GetServiceStage()->Send(message)) {
    MI_LOG_WARN(logger, "SyncClientChannel::OnDecodeMessage Send message fail");
    MessageFactory::Destroy(message);
    return;
  }

  TryFireMessage();
}
コード例 #4
0
int SyncClientChannel::EncodeMessage(ProtocolMessage* message) {
  if (GetStatus() != kConnected) { 
    MI_LOG_DEBUG(logger, "SyncClientChannel::EncodeMessage ChannelBroken:" << GetStatus());
    return -1;
  }

  if (0 != sequence_keeper_.Register(message)) {
    MI_LOG_WARN(logger, "SyncClientChannel::EncodeMessage Register fail");
    return -1;
  }

  TryFireMessage();
  return 0; 
}
コード例 #5
0
void SyncClientChannel::TryFireMessage() {
  while (true) {
    ProtocolMessage* fire_message = sequence_keeper_.Fire();
    if (!fire_message) {
      return;
    }

    if (Protocol::kEncodeSuccess != GetProtocol()->Encode(&write_buffer_, fire_message)) {
      MI_LOG_WARN(logger, "SyncClientChannel::TryFireMessage encode fail");
      DoSendBack(fire_message, ProtocolMessage::kStatusEncodeFail);
      sequence_keeper_.Fetch();
      continue;
    }

    OnWrite();
    break;
  }
}
コード例 #6
0
ファイル: config_manager.cpp プロジェクト: wolfhead/minotaur
int ConfigManager::LoadServicesConfig(tinyxml2::XMLElement* element, ServicesConfig* config) {
  if (!element) {
    MI_LOG_WARN(logger, "ConfigManager::LoadServicesConfig no element");
    return 0;
  }

  tinyxml2::XMLElement* service = element->FirstChildElement("service");
  while (service) {
    ServiceConfig service_config;

    XML_LOAD_STRING(service, "address", service_config.address, -1);
    XML_LOAD_STRING(service, "name", service_config.name, -1);

    services_config_.push_back(service_config);
    service = service->NextSiblingElement("service");
  }

  return 0;
}