Ice::Identity IceStormInternal::nameToIdentity(const InstancePtr& instance, const string& name) { // Identity is instanceName>/topic.<topicname> Ice::Identity id; id.category = instance->instanceName(); id.name = "topic." + name; return id; }
SubscriberPtr Subscriber::create( const InstancePtr& instance, const SubscriberRecord& rec) { if(rec.link) { return new SubscriberLink(instance, rec); } else { PerSubscriberPublisherIPtr per = new PerSubscriberPublisherI(instance); Ice::Identity perId; perId.category = instance->instanceName(); perId.name = "topic." + rec.topicName + ".publish." + instance->communicator()->identityToString(rec.obj->ice_getIdentity()); Ice::ObjectPrx proxy = instance->publishAdapter()->add(per, perId); TraceLevelsPtr traceLevels = instance->traceLevels(); SubscriberPtr subscriber; try { int retryCount = 0; QoS::const_iterator p = rec.theQoS.find("retryCount"); if(p != rec.theQoS.end()) { retryCount = atoi(p->second.c_str()); } string reliability; p = rec.theQoS.find("reliability"); if(p != rec.theQoS.end()) { reliability = p->second; } if(!reliability.empty() && reliability != "ordered") { throw BadQoS("invalid reliability: " + reliability); } // // Override the timeout. // Ice::ObjectPrx newObj; try { newObj = rec.obj->ice_timeout(instance->sendTimeout()); } catch(const Ice::FixedProxyException&) { // // In the event IceStorm is collocated this could be a // fixed proxy in which case its not possible to set the // timeout. // newObj = rec.obj; } p = rec.theQoS.find("locatorCacheTimeout"); if(p != rec.theQoS.end()) { istringstream is(IceUtilInternal::trim(p->second)); int locatorCacheTimeout; if(!(is >> locatorCacheTimeout) || !is.eof()) { throw BadQoS("invalid locator cache timeout (numeric value required): " + p->second); } newObj = newObj->ice_locatorCacheTimeout(locatorCacheTimeout); } p = rec.theQoS.find("connectionCached"); if(p != rec.theQoS.end()) { istringstream is(IceUtilInternal::trim(p->second)); int connectionCached; if(!(is >> connectionCached) || !is.eof()) { throw BadQoS("invalid connection cached setting (numeric value required): " + p->second); } newObj = newObj->ice_connectionCached(connectionCached > 0); } if(reliability == "ordered") { if(!newObj->ice_isTwoway()) { throw BadQoS("ordered reliability requires a twoway proxy"); } subscriber = new SubscriberTwoway(instance, rec, proxy, retryCount, 1, newObj); } else if(newObj->ice_isOneway() || newObj->ice_isDatagram()) { if(retryCount > 0) { throw BadQoS("non-zero retryCount QoS requires a twoway proxy"); } subscriber = new SubscriberOneway(instance, rec, proxy, retryCount, newObj); } else if(newObj->ice_isBatchOneway() || newObj->ice_isBatchDatagram()) { if(retryCount > 0) { throw BadQoS("non-zero retryCount QoS requires a twoway proxy"); } subscriber = new SubscriberBatch(instance, rec, proxy, retryCount, newObj); } else //if(newObj->ice_isTwoway()) { assert(newObj->ice_isTwoway()); subscriber = new SubscriberTwoway(instance, rec, proxy, retryCount, 5, newObj); } per->setSubscriber(subscriber); }