BlockerAttr
cyber\blocker\blocker_test.cc的第一个使用例子:
首先,BlockAttr说明了Block的一些属性,是用来帮助创建Blocker的。我们来看下它的定义:
从上面可以看出,它是一个结构体,有两个成员:
- capacity
- channel_name
另外还提供了一些构造函数
BlockerBase
我们看下Blocker的定义:
Block继承自BlockerBase
可以看到BlockerBase是一个纯虚的虚函数,定义了很多接口
Blocker
Blocker是Reader中的一个成员,Reader会将自己的数据拷贝一份到Block中
可以将Blocker理解为一个消息的缓存类,同时也记录了该Reader的一些回调函数。
- Subscribe/ Unsubscribe注册或者取消回调函数
- Blocker::Observe()注册监控已经发布[reset之后,调用本函数之前的]的所有消息
- 当Publish(msg)时会将消息入队并回调所有注册的回调函数
成员变量
数据类型 | 变量名 | 作用 |
---|---|---|
BlockerAttr | attr_; | |
MessageQueue | observed_msg_queue_; |
|
MessageQueue | published_msg_queue_; |
|
mutable std::mutex | msg_mutex_; | |
CallbackMap | published_callbacks_; |
|
mutable std::mutex | cb_mutex_; | |
MessageType | dummy_msg_; |
|
重要私有函数
Blocker::Reset()
清空三个函数(确保线程安全)
可以和析构函数对比着看,在析构函数中就不需要保证线程安全了
Blocker::Enqueue
这里就做了一件事情: 将消息入队(并且要确保排队消息不超过最大容量)
Blocker::Notify
这里也只做了一件事情:使用msg作为入参并回调所有记录在册的回调函数
重要公有函数
Blocker::Publish(msg)
作用:入队,并调用回调函数
Blocker::Observe()
就是将published_msg_queue_直接赋值给observed_msg_queue_
监听所有已经发布的消息
Subscribe/ Unsubscribe
设置published_callbacks_
这个published_callbacks_在Blocker::Notify时使用,而Blocker::Notify在Blocker::Publish时使用
为什么要有Blocker?
- (据说:Blocker中的数据时用来仿真的????)
- blocker是把从Reader那边得到的数据放到自己的message queue中,再提供一个接口给Reader中。
- 提供一个管理着获取数据的入口,方便debug,记录日志,运行虚拟环境和监控整个系统
- Blocker里注册的回调函数应该都是管理员注册的监控函数,和系统主逻辑没有关系
- 主要是帮Reader管理数据相关的逻辑
BlockerManager
首先,这是一个单例模式
成员变量
数据类型 | 变量名 | 作用 |
---|---|---|
BlockerMap | blockers_; |
|
std::mutex | blocker_mutex_; |
重要公有函数
GetOrCreateBlocker
从blockers_中查找或者创建一个新的缓存块
GetBlocker
从blockers_查找channel对应的块,如果找到就返回其共享指针,否则返回NULL
BlockerManager::Publish
BlockerManager::Subscribe
怎么用
小结:
BlockerXXX相关的类实现了这样一个功能:
- 可以使用public往某个channel发布某个msg(有容量限制)
- 所有Subscribe这个channel的回调函数会被调用