网站建设需求分析文档,园林景观设计公司总工岗位职责,广州网页设计培训视频,wordpress woo插件使用提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录 前言管理的字段 前言
搭建一个网络服务器#xff0c;在内部提供各个业务接口即可。 在业务处理函数中#xff0c;每次请求过来找到对应的信道#xff0c;通过信… 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录 前言管理的字段 前言
搭建一个网络服务器在内部提供各个业务接口即可。 在业务处理函数中每次请求过来找到对应的信道通过信道句柄调用前边封装好的处理接口进行处理最后返回响应即可。 管理的字段
服务器需要管理的字段其中需要搭建一个tcp服务器。然后就是我们业务所需的句柄一个是虚拟机管理句柄消费者管理句柄连接管理句柄和线程池句柄。 class Server
{
private:using MessagePtr std::shared_ptrgoogle::protobuf::Message;muduo::net::TcpServer _server;muduo::net::EventLoop _baseloop;ProtobufCodecPtr _codec; // 协议处理器 对收到的请求进行protobuf协议处理ProtobufDispatcher _dispatcher; // 请求分发器VirtualHost::ptr _host;ConsumerManager::ptr _consumer_manager;ConnectionManager::ptr _connection_manager;ThreadPool::ptr _pool;
}我们需要为服务器注册业务请求处理函数。muduo库是支持protobuf协议的处理的。
// 注册请求处理函数
_dispatcher.registerMessageCallbackopenChannelRequest(std::bind(Server::OnOpenChannel,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallbackcloseChannelRequest(std::bind(Server::OnClodeChannle,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallbackdeclareExchangeRequest(std::bind(Server::OnDeclareExchange,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallbackdeleteExchangeRequest(std::bind(Server::OnDeleteExchange,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallbackdeclareQueueRequest(std::bind(Server::OnDeclareQueue,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallbackdeleteQueueRequest(std::bind(Server::OnDeleteQueue,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallbackqueueBindRequest(std::bind(Server::onQueueBind,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallbackqueueUnBindRequest(std::bind(Server::onQueueUnBind,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallbackbasicPublishRequest(std::bind(Server::onBasicPublish,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallbackbasicAckRequest(std::bind(Server::onBasicAck,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallbackbasicConsumeRequest(std::bind(Server::onBasicConsume,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
_dispatcher.registerMessageCallbackbasicCancelRequest(std::bind(Server::onBasicCancel,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));}当新连接建立时我们需调用连接句柄创建一个新连接。 而连接断开时需要删除连接对象。
void onConnection(const muduo::net::TcpConnectionPtr conn){if (conn-connected() true){LOG_INFO 新连接建立了;_connection_manager-newConnection(_host,_consumer_manager,_codec,conn,_pool);}else{LOG_INFO 连接断开了;_connection_manager-delConnection(conn);}}而其他注册的业务处理函数也比较简答大体流程就是通过连接找到对应的连接管理对象然后通过请求中的rid字段找道连接管理中的对应信道。调用信道中封装好的处理接口进行处理即可。
void OnDeclareExchange(const muduo::net::TcpConnectionPtr conn,const declareExchangeRequestPtr message,muduo::Timestamp){Connection::ptr mconn _connection_manager-getConnection(conn);if(mconn.get() nullptr){DLOG(声明交换机时没有找到连接对应的Connection对象);conn-shutdown();return;}Channel::ptr cp mconn-getChannel(message-cid());if(cp.get() nullptr){DLOG(声明交换机时没有找到信道);conn-shutdown();return;}return cp-declareExchange(message);
}这里有两个比较特殊一个打开信道一个是关闭信道 这两个操作是通过连接找到连接管理对象然后调用连接管理对象提供的打开信道和关闭信道操作进行处理。
void OnOpenChannel(const muduo::net::TcpConnectionPtr conn,const openChannelRequestPtr message,muduo::Timestamp){Connection::ptr mconn _connection_manager-getConnection(conn);if(mconn.get() nullptr){DLOG(打开信道时没有找到连接对应的Connection对象);conn-shutdown();return;}return mconn-openChannel(message);
}
//关闭信道
void OnClodeChannle(const muduo::net::TcpConnectionPtr conn,const closeChannelRequestPtr message,muduo::Timestamp){Connection::ptr mconn _connection_manager-getConnection(conn);if(mconn.get() nullptr){DLOG(关闭信道时没有找到连接对应的Connection对象);conn-shutdown();return;}return mconn-closeChannel(message);
}在构造函数的时候由于队列消费者是以队列为单位管理的所以我们要获取已经存在的队列来进行队列消费者的初始化。
//消费者是按照队列为单元进行管理的,针对历史消息中的所有队列需要初始化队列的消费者管理结构QueueConsumerstd::unordered_mapstd::string, mq::MsgQueue::ptr mqmp _host-allQueue();for(auto mq : mqmp){_consumer_manager-initQueueConsumer(mq.first);}