申明/删除交换机
删除交换机的时候也需要删除交换机的所有绑定关系
//交换机操作
bool declareExchange(const std::string &name,
ExchangeType type, bool durable, bool auto_delete,
const google::protobuf::Map<std::string, std::string> &args){
return _emp->declareExchange(name,type,durable,auto_delete,args);
}
void deleteExchange(const std::string &name){
//删除交换机,同时需要删除交换机的所有绑定信息
_bmp->removeExchangeBindngs(name);
_emp->deleteExchange(name);
}
申明/删除队列
申明队列时,需要为队列创建队列消息管理。
删除队列时需要删除队列的绑定信息和队列消息管理对象.
bool declareQueue(const std::string &name, bool durable,
bool exclusive, bool auto_delete,
const google::protobuf::Map<std::string, std::string> &args){
//创建队列时,需要位队列创建队列消息管理
_mmp->InitQueueMessage(name);
return _mqmp->declareQueue(name,durable,exclusive,auto_delete,args);
}
void deleteQueue(const std::string &name){
//删除队列,同时需要删除队列所有的绑定信息和队列消息
_bmp->removeMsgQueueBindings(name);
_mmp->DestoryQueueMessage(name);
_mqmp->deleteQueue(name);
}
绑定/解除绑定
绑定关系的持久化是由交换机个队列的持久化决定的。只要当两个的持久化都为1,绑定关系的持久化标志位才为1.
//绑定信息的操作
void bind(const std::string &ename, const std::string &qname, const std::string &key){
//需要判断队列和交换机的持久化标志位
Exchange::ptr ecp = _emp->selectExchange(ename);
if(ecp.get() == nullptr){
ELOG("进行队列绑定失败,交换机%s不存在",ename.c_str());
return;
}
MsgQueue::ptr mqp = _mqmp->selectQueue(qname);
if(mqp.get() == nullptr){
ELOG("进行队列绑定失败,队列%s不存在",qname.c_str());
return;
}
//交换机和队列的持久化位必须同时满足,绑定消息的数据才可以持久化
_bmp->bind(ename,qname,key,ecp->durable && mqp->durable);
}
void unbind(const std::string &ename, const std::string &qname){
_bmp->unbind(ename,qname);
}
发布消息
发布消息就是调用指定队列的队列消息管理对象的操作,插入一个MessagePtr到链表中,同时持久化。另外需要把队列的持久化标志传入进去,进行判断。
//发布一条消息,只是做了一个存储
bool basicPublish(const std::string &qname, BasicProperties *bp, std::string body){
//需要判断队列的持久化标志位
MsgQueue::ptr mqp = _mqmp->selectQueue(qname);
if(mqp.get() == nullptr){
ELOG("发布消息失败,队列%s不存在",qname.c_str());
return false;
}
return _mmp->insert(qname,bp,body,mqp->durable);
}
消费消息/消息确认
消费消息则是获取指定队列的队列消息管理对象进行操作。
消息确认类似的操作.
//消费一条消息,只是把消息取出,由路由交换模块进行推送消息
MessagePtr basicConsume(const std::string &qname){
return _mmp->front(qname);
}
//确认一条消息,就是做删除
void basicAck(const std::string &qname,const std::string &msg_id){
_mmp->ack(qname,msg_id);
}