void RebalanceImpl::rebalanceByTopic(const std::string& topic)
{
	switch (m_messageModel)
	{
	case BROADCASTING:
		{
			std::map<std::string, std::set<MessageQueue> >::iterator it = m_topicSubscribeInfoTable.find(topic);

			if (it != m_topicSubscribeInfoTable.end())
			{
				std::set<MessageQueue> mqSet = it->second;
				bool changed = updateProcessQueueTableInRebalance(topic, mqSet);
				if (changed)
				{
					messageQueueChanged(topic, mqSet, mqSet);
					//TODO log.info("messageQueueChanged {} {} {} {}",//
					//	consumerGroup,//
					//	topic,//
					//	mqSet,//
					//	mqSet);
				}
			}
			else
			{
				//TODO log.warn("doRebalance, {}, but the topic[{}] not exist.", consumerGroup, topic);
			}
			break;
		}
	case CLUSTERING:
		{
			std::map<std::string, std::set<MessageQueue> >::iterator it = m_topicSubscribeInfoTable.find(topic);

			if (it == m_topicSubscribeInfoTable.end())
			{
				if (topic.find(MixAll::RETRY_GROUP_TOPIC_PREFIX) !=0 )
				{
					//TODO log.warn("doRebalance, {}, but the topic[{}] not exist.", consumerGroup, topic);
				}
			}

			std::list<std::string> cidAll = m_pMQClientFactory->findConsumerIdList(topic, m_consumerGroup);

			if (cidAll.empty())
			{
				//TODO log.warn("doRebalance, {} {}, get consumer id list failed", consumerGroup, topic);
			}

			if (it != m_topicSubscribeInfoTable.end() && !cidAll.empty())
			{
				std::vector<MessageQueue> mqAll;
				std::set<MessageQueue> mqSet = it->second;
				std::set<MessageQueue>::iterator its = mqSet.begin();

				//set 本身已经排序
				for (; its != mqSet.end();its++)
				{
					mqAll.push_back(*its);
				}

				// 排序
				cidAll.sort();

				AllocateMessageQueueStrategy* strategy = m_pAllocateMessageQueueStrategy;

				// 执行分配算法
				std::vector<MessageQueue>* allocateResult;
				try
				{
					allocateResult = strategy->allocate(m_pMQClientFactory->getClientId(), mqAll, cidAll);
				}
				catch (...)
				{
					//TODO log.error("AllocateMessageQueueStrategy.allocate Exception", e);
				}

				std::set<MessageQueue> allocateResultSet;
				if (allocateResult != NULL)
				{
					for(size_t i=0;i<allocateResult->size();i++)
					{
						allocateResultSet.insert(allocateResult->at(i));
					}

					delete allocateResult;
				}

				// 更新本地队列
				bool changed = updateProcessQueueTableInRebalance(topic, allocateResultSet);
				if (changed)
				{
					//TODO	log.info("reblance result is [{}], ConsumerId is [{}], mqAll is[{}], cidAll is [{}]",
					//		allocateResult, this.mQClientFactory.getClientId(), mqAll, cidAll);

					messageQueueChanged(topic, mqSet, allocateResultSet);
					//TODO log.info("messageQueueChanged {} {} {} {}",//
					//	consumerGroup,//
					//	topic,//
					//	mqSet,//
					//	allocateResultSet);

					//log.info("messageQueueChanged consumerIdList: {}",//
					//	cidAll);
				}
			}
			break;
		}
	default:
		break;
	}
}
void RebalanceImpl::rebalanceByTopic(const std::string& topic)
{
    switch (m_messageModel)
    {
    case BROADCASTING:
    {
        std::map<std::string, std::set<MessageQueue> >::iterator it = m_topicSubscribeInfoTable.find(topic);

        if (it != m_topicSubscribeInfoTable.end())
        {
            std::set<MessageQueue> mqSet = it->second;
            bool changed = updateProcessQueueTableInRebalance(topic, mqSet);
            if (changed)
            {
                messageQueueChanged(topic, mqSet, mqSet);
                //TODO log.info("messageQueueChanged {} {} {} {}",//
                //	consumerGroup,//
                //	topic,//
                //	mqSet,//
                //	mqSet);
            }
        }
        else
        {
            //TODO log.warn("doRebalance, {}, but the topic[{}] not exist.", consumerGroup, topic);
        }
        break;
    }
    case CLUSTERING:
    {
        std::map<std::string, std::set<MessageQueue> >::iterator it = m_topicSubscribeInfoTable.find(topic);

        if (it == m_topicSubscribeInfoTable.end())
        {
            if (topic.find(MixAll::RETRY_GROUP_TOPIC_PREFIX) !=0 )
            {
                Logger::get_logger()->warn("doRebalance, {}, but the topic[{}] not exist.", m_consumerGroup, topic);
            }
        }
        //	std::cout<<"findConsumerIdList::::"<<topic<<","<<m_consumerGroup<<std::endl;

        std::list<std::string> cidAll = m_pMQClientFactory->findConsumerIdList(topic, m_consumerGroup);

        //	std::cout<<"cidAll::::"<<cidAll.size()<<std::endl;
        if (cidAll.empty())
        {
            Logger::get_logger()->warn("doRebalance, {} {}, get consumer id list failed", m_consumerGroup, topic);
        }
        else
            Logger::get_logger()->warn("doRebalance, {} {}, get consumer id list succeed doRebalance ", m_consumerGroup, topic);
        if (it != m_topicSubscribeInfoTable.end() && !cidAll.empty())
        {
            std::vector<MessageQueue> mqAll;
            std::set<MessageQueue> mqSet = it->second;
            std::set<MessageQueue>::iterator its = mqSet.begin();

            //set 本身已经排序
            for (; its != mqSet.end(); its++)
            {
                mqAll.push_back(*its);
            }

            // 排序
            cidAll.sort();

            AllocateMessageQueueStrategy* strategy = m_pAllocateMessageQueueStrategy;

            // 执行分配算法
            std::vector<MessageQueue>* allocateResult;
            try
            {
                allocateResult = strategy->allocate(m_pMQClientFactory->getClientId(), mqAll, cidAll);
                std::cout<<allocateResult->size()<<std::endl;
                std::vector<MessageQueue>::iterator it = allocateResult->begin();
                for(; it!=allocateResult->end(); it++) {
                    MessageQueue ms = *it;
                    std::cout<<ms.toString()<<std::endl;
                }
            }
            catch (...)
            {
                Logger::get_logger()->error("AllocateMessageQueueStrategy.allocate Exception");
            }

            std::set<MessageQueue> allocateResultSet;
            if (allocateResult != NULL)
            {
                for(size_t i=0; i<allocateResult->size(); i++)
                {
                    allocateResultSet.insert(allocateResult->at(i));
                }

                delete allocateResult;
            }

            // 更新本地队列
            bool changed = updateProcessQueueTableInRebalance(topic, allocateResultSet);
            if (changed)
            {
//					Logger::get_logger()->info(
//							"rebalanced allocate source.  group={}, topic={}, mqAllSize={}, cidAllSize={}, mqAll={}, cidAll={}",
//							m_consumerGroup, topic, mqSet.size(), cidAll.size(), mqSet, cidAll);
//					Logger::get_logger()->info(
//							"rebalanced result changed., group={}, topic={}, ConsumerId={}, rebalanceSize={},{},{} rebalanceMqSet={}",
//							m_consumerGroup, topic, m_pMQClientFactory->getClientId(),
//							allocateResultSet.size(), mqAll.size(), cidAll.size(), allocateResultSet);

                messageQueueChanged(topic, mqSet, allocateResultSet);

            }
        }
        break;
    }
    default:
        break;
    }
}