void Service::toService(ServiceType serviceType, const char * block, unsigned int len, ServiceCallback cb) { OutOfBand oob; if (getServiceType() == STAvatar) { oob.clientDockerID = getClientDockerID(); oob.clientSessionID = getClientSessionID(); oob.clientAvatarID = getServiceID(); } toService(serviceType, InvalidServiceID, oob, block, len, cb); }
bool Service::finishLoad() { setStatus(SS_WORKING); if (!isShell()) { if (true) { LoadServiceNotice notice; notice.shellServiceInfos.push_back(ServiceInfo( getServiceDockerID(), getServiceType(), getServiceID(), getServiceName(), getStatus(), getClientDockerID(), getClientSessionID())); Docker::getRef().broadcastToDockers(notice, false); } if (getServiceTrait(getServiceType()) == STrait_Multi) { RefreshServiceToMgrNotice refreshNotice; refreshNotice.shellServiceInfos.push_back(ServiceInfo( getServiceDockerID(), getServiceType(), getServiceID(), getServiceName(), getStatus(), getClientDockerID(), getClientSessionID())); for (auto sd : ServiceDepends) { if (getServiceTrait(sd.first) == STrait_Single ) { toService(sd.first, refreshNotice, nullptr); } } } LOGI(*this << "local service finish load. service=" << getServiceName() << ", id=" << getServiceID()); } else { LOGI(*this << "remote service finish load. service=" << getServiceName() << ", id=" << getServiceID()); } return true; }
bool Service::finishUnload() { setStatus(SS_DESTROY); if (!isShell()) { if (getServiceTrait(getServiceType()) == STrait_Multi) { RefreshServiceToMgrNotice refreshNotice; refreshNotice.shellServiceInfos.push_back(ServiceInfo( getServiceDockerID(), getServiceType(), getServiceID(), getServiceName(), getStatus(), getClientDockerID(), getClientSessionID())); for (auto sd : ServiceDepends) { if (getServiceTrait(sd.first) == STrait_Single) { toService(sd.first, refreshNotice, nullptr); } } } UnloadedServiceNotice notice(getServiceType(), getServiceID()); Docker::getRef().broadcastToDockers(notice, true); LOGI(*this << "local service finish unload. service=" << getServiceName() << ", id=" << getServiceID()); } else { LOGI(*this << "remote service finish unload. service=" << getServiceName() << ", id=" << getServiceID()); } for (auto tID : _repeatTimers) { SessionManager::getRef().cancelTimer(tID); } _repeatTimers.clear(); return true; }
void OfflineService::onRefreshServiceToMgrNotice(const Tracing & trace, zsummer::proto4z::ReadStream &rs) { RefreshServiceToMgrNotice notice; rs >> notice; for (const auto & si : notice.shellServiceInfos) { if (si.status == SS_WORKING && si.clientSessionID != InvalidSessionID) { for (auto iter = _offlines._data.begin(); iter != _offlines._data.end();) { auto offline = *iter; if (offline.avatarID == si.serviceID && offline.status == 0) { toService(STAvatar, offline.avatarID, offline.streamBlob.c_str(), (unsigned int)offline.streamBlob.length()); offline.status = 1; _offlines.updateToDB(offline); iter = _offlines._data.erase(iter); continue; } iter++; } } } }
bool OfflineService::onLoad() { DBQueryReq req("SELECT max(id) FROM `tb_AvatarOffline`"); toService(STInfoDBMgr, req, std::bind(&OfflineService::onLoadMaxOfflineID, this, _1)); return true; }
void Service::toService(ServiceType serviceType, const OutOfBand &oob, const char * block, unsigned int len, ServiceCallback cb) { toService(serviceType, InvalidServiceID, oob, block, len, cb); }