Пример #1
0
void redisworker::task(const RedisValue& value)
{
	if(value.isOk())
	{
		std::cout<<value.toArray()[0].toString()<<std::endl;
		std::cout<<value.toArray()[1].toString()<<std::endl;
		m_taskcb(value);
		m_redis.command("BRPOP",m_para.task_title,"push:test2",0,boost::bind(&redisworker::onBrpop,this,_1));
		if(value.toArray()[1].toString()  == m_para.quitcmd)
			m_ioService.stop();
	}
	else
	{
		std::cerr<<"BRPOP: error"<<value.toString()<<std::endl;
	}
}
Пример #2
0
void RedisClientImpl::doProcessMessage(const RedisValue &v)
{
    if( state == RedisClientImpl::Subscribed )
    {
        std::vector<RedisValue> result = v.toArray();

        if( result.size() == 3 )
        {
            const RedisValue &command = result[0];
            const RedisValue &queue = result[1];
            const RedisValue &value = result[2];

            const std::string &cmd = command.toString();

            if( cmd == "message" )
            {
                SingleShotHandlersMap::iterator it = singleShotMsgHandlers.find(queue.toString());
                if( it != singleShotMsgHandlers.end() )
                {
                    strand.post(boost::bind(it->second, value.toString()));
                    singleShotMsgHandlers.erase(it);
                }

                std::pair<MsgHandlersMap::iterator, MsgHandlersMap::iterator> pair =
                        msgHandlers.equal_range(queue.toString());
                for(MsgHandlersMap::iterator it = pair.first; it != pair.second; ++it)
                    strand.post(boost::bind(it->second.second, value.toString()));
            }
            else if( cmd == "subscribe" && handlers.empty() == false )
            {
                handlers.front()(v);
                handlers.pop();
            }
            else if(cmd == "unsubscribe" && handlers.empty() == false )
            {
                handlers.front()(v);
                handlers.pop();
            }
            else
            {
                std::stringstream ss;

                ss << "[RedisClient] invalid command: "
                   << command.toString();

                onError(ss.str());
                return;
            }
        }
        else
        {
            onError("[RedisClient] Protocol error");
            return;
        }
    }
    else
    {
        if( handlers.empty() == false )
        {
            handlers.front()(v);
            handlers.pop();
        }
        else
        {
            std::stringstream ss;

            ss << "[RedisClient] unexpected message: "
               <<  v.inspect();

            onError(ss.str());
            return;
        }
    }
}