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; } }
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; } } }