//------------------------------------------------------------------------------------- bool ForwardAnywhere_MessageBuffer::process() { if(pBundles_.size() <= 0) { start_ = false; return false; } Components::COMPONENTS cts = Components::getSingleton().getComponents(forwardComponentType_); size_t idx = 0; if(cts.size() > 0) { // 必须所有的组件频道都被设置, 如果不是则等待。 Components::COMPONENTS::iterator ctiter = cts.begin(); for(; ctiter != cts.end(); ctiter++) { if((*ctiter).pChannel == NULL) return true; } std::vector<ForwardItem*>::iterator iter = pBundles_.begin(); for(; iter != pBundles_.end(); iter++) { (*iter)->pBundle->send(networkInterface_, cts[idx].pChannel); Mercury::Bundle::ObjPool().reclaimObject((*iter)->pBundle); (*iter)->pBundle = NULL; idx++; if(idx >= cts.size()) idx = 0; if((*iter)->pHandler != NULL) { (*iter)->pHandler->process(); SAFE_RELEASE((*iter)->pHandler); } SAFE_RELEASE((*iter)); } DEBUG_MSG(boost::format("ForwardAnywhere_MessageBuffer::process(): size:%1%.\n") % pBundles_.size()); pBundles_.clear(); start_ = false; return false; } return true; }
//------------------------------------------------------------------------------------- void Dbmgr::onRegisterNewApp(Mercury::Channel* pChannel, int32 uid, std::string& username, int8 componentType, uint64 componentID, uint32 intaddr, uint16 intport, uint32 extaddr, uint16 extport) { ServerApp::onRegisterNewApp(pChannel, uid, username, componentType, componentID, intaddr, intport, extaddr, extport); KBEngine::COMPONENT_TYPE tcomponentType = (KBEngine::COMPONENT_TYPE)componentType; // 下一步: // 如果是连接到dbmgr则需要等待接收app初始信息 // 例如:初始会分配entityID段以及这个app启动的顺序信息(是否第一个baseapp启动) if(tcomponentType == BASEAPP_TYPE || tcomponentType == CELLAPP_TYPE || tcomponentType == LOGINAPP_TYPE) { Mercury::Bundle* pBundle = Mercury::Bundle::ObjPool().createObject(); int32 startGlobalOrder = Componentbridge::getComponents().getGlobalOrderLog()[getUserUID()]; int32 startGroupOrder = 0; switch(tcomponentType) { case BASEAPP_TYPE: { startGroupOrder = Componentbridge::getComponents().getBaseappGroupOrderLog()[getUserUID()]; onGlobalDataClientLogon(pChannel, BASEAPP_TYPE); std::pair<ENTITY_ID, ENTITY_ID> idRange = idServer_.allocRange(); (*pBundle).newMessage(BaseappInterface::onDbmgrInitCompleted); BaseappInterface::onDbmgrInitCompletedArgs5::staticAddToBundle((*pBundle), g_kbetime, idRange.first, idRange.second, startGlobalOrder, startGroupOrder); } break; case CELLAPP_TYPE: { startGroupOrder = Componentbridge::getComponents().getCellappGroupOrderLog()[getUserUID()]; onGlobalDataClientLogon(pChannel, CELLAPP_TYPE); std::pair<ENTITY_ID, ENTITY_ID> idRange = idServer_.allocRange(); (*pBundle).newMessage(CellappInterface::onDbmgrInitCompleted); CellappInterface::onDbmgrInitCompletedArgs5::staticAddToBundle((*pBundle), g_kbetime, idRange.first, idRange.second, startGlobalOrder, startGroupOrder); } break; case LOGINAPP_TYPE: startGroupOrder = Componentbridge::getComponents().getLoginappGroupOrderLog()[getUserUID()]; (*pBundle).newMessage(LoginappInterface::onDbmgrInitCompleted); LoginappInterface::onDbmgrInitCompletedArgs2::staticAddToBundle((*pBundle), startGlobalOrder, startGroupOrder); break; default: break; } (*pBundle).send(networkInterface_, pChannel); Mercury::Bundle::ObjPool().reclaimObject(pBundle); } // 如果是baseapp或者cellapp则将自己注册到所有其他baseapp和cellapp if(tcomponentType == BASEAPP_TYPE || tcomponentType == CELLAPP_TYPE) { KBEngine::COMPONENT_TYPE broadcastCpTypes[2] = {BASEAPP_TYPE, CELLAPP_TYPE}; for(int idx = 0; idx < 2; idx++) { Components::COMPONENTS cts = Components::getSingleton().getComponents(broadcastCpTypes[idx]); Components::COMPONENTS::iterator fiter = cts.begin(); for(; fiter != cts.end(); fiter++) { if((*fiter).cid == componentID) continue; Mercury::Bundle* pBundle = Mercury::Bundle::ObjPool().createObject(); ENTITTAPP_COMMON_MERCURY_MESSAGE(broadcastCpTypes[idx], (*pBundle), onGetEntityAppFromDbmgr); if(tcomponentType == BASEAPP_TYPE) { BaseappInterface::onGetEntityAppFromDbmgrArgs8::staticAddToBundle((*pBundle), uid, username, componentType, componentID, intaddr, intport, extaddr, extport); } else { CellappInterface::onGetEntityAppFromDbmgrArgs8::staticAddToBundle((*pBundle), uid, username, componentType, componentID, intaddr, intport, extaddr, extport); } KBE_ASSERT((*fiter).pChannel != NULL); (*pBundle).send(networkInterface_, (*fiter).pChannel); Mercury::Bundle::ObjPool().reclaimObject(pBundle); } } } }