void ServiceManager::stopQuery(const ServiceFilter& filter) { RScopeLock lock(_mutex); if (_localQueries.find(filter) != _localQueries.end()) { Message* unqueryMsg = filter.toMessage(); unqueryMsg->putMeta("um.rpc.type", "stopDiscovery"); unqueryMsg->putMeta("um.rpc.mgrId", _svcSub->getUUID()); _svcPub->send(unqueryMsg); delete unqueryMsg; _localQueries.erase(filter); } }
/** * Start a query for a service. * * Remember service filter and send query to all connected ServiceManagers. */ void ServiceManager::startQuery(const ServiceFilter& filter, ResultSet<ServiceDescription>* listener) { RScopeLock lock(_mutex); _localQueries[filter] = listener; Message* queryMsg = filter.toMessage(); queryMsg->putMeta("um.rpc.type", "startDiscovery"); queryMsg->putMeta("um.rpc.mgrId", _svcSub->getUUID()); _svcPub->send(queryMsg); UM_LOG_INFO("Sending new query to %d ServiceManagers", _svcPub->waitForSubscribers(0)); delete queryMsg; }
ServiceDescription ServiceManager::find(const ServiceFilter& svcFilter, int timeout) { if(_svcPub->waitForSubscribers(1, timeout) < 1) { // there is no other ServiceManager yet UM_LOG_INFO("Failed to find another ServiceManager"); return ServiceDescription(); } Message* findMsg = svcFilter.toMessage(); std::string reqId = UUID::getUUID(); findMsg->putMeta("um.rpc.type", "discover"); findMsg->putMeta("um.rpc.reqId", reqId.c_str()); findMsg->putMeta("um.rpc.mgrId", _svcSub->getUUID()); // Thread::sleepMs(1000); if(_findRequests.find(reqId) != _findRequests.end()) UM_LOG_WARN("Find request %s already received", reqId.c_str()); _findRequests[reqId] = new Monitor(); _svcPub->send(findMsg); delete findMsg; RScopeLock lock(_mutex); _findRequests[reqId]->wait(_mutex, timeout); delete _findRequests[reqId]; _findRequests.erase(reqId); if (_findResponses.find(reqId) == _findResponses.end()) { UM_LOG_INFO("Failed to find %s", svcFilter.getServiceName().c_str()); return ServiceDescription(); } // TODO: Remove other replies as they come in! Message* foundMsg = _findResponses[reqId]; assert(foundMsg != NULL); ServiceDescription svcDesc(foundMsg); svcDesc._svcManager = this; _findResponses.erase(reqId); delete foundMsg; return svcDesc; }