原创博文,转载请说明出处
前面讲到一个事件都有 publisher 和 subscriber,在 pox 中 publisher 和 subscriber 都是 EventMixin 类 (pox.lib.revent.revent.EventMixin) 的子类,例如 POX 中经常用到的 Connection 类、OpenFlow_01_Task 类、POXCore 类,以及 pox.forwarding 中的 components 都继承自 EventMixin,自己写的component也通常都要继承 EventMixin 类。
下面介绍一个设置事件监听常用的几个函数,都定义在 EventMixin 类中:
1. addListener
def addListener (self, eventType, handler, once=False, weak=False, priority=None, byName=False)
功能:为指定的事件绑定相应的
handler
eventType:事件类,包括POX中已经定义的事件和自己定义的事件(Event类的子类),如果
byName是True,
eventType应该是一个字符串。
handler:event的处理方法
once:如果为True,handler将在第一次被触发后移除
weak:event的
publisher和
subscriber存在依赖关系,
例如handler定义在A中,event在B中抛出,那么A对B有依赖关系,必须在A被realse或者监听关系被移除之后,B才能被realse。如果该值
为False,则publisher和subscriber的生存时间没有关系。
priority:设置handler的优先级,如果一个事件有多个handler。。。
byName:默认为False,则
eventType必须为Event类的一个子类,如果为True,则eventType必须为一个字符串
方法最后会返回一个tuple:(eventType,eid),eid为生成的event的id
example:
pox.openflow.of_01.OpenFlow_01_Task.__init__()
core.addListener(pox.core.GoingUpEvent, self._handle_GoingUpEvent)
并且定义了相应的handler
def _handle_GoingUpEvent (self, event):
self.start()
2. addListenerByName
def addListenerByName (self, *args, **kw)
3. listenTo
def listenTo (self, source, *args, **kv)
功能:自身监听source中抛出的所有事件,其中source也是一个
EventMixin类的实例。
同时由于
listenTo是定义在
EventMixin类中的一个方法,因此这个方法常见于
EventMixin类的子类中
example:
pox.forwarding.l3_learning.l3_switch._handle_GoingUpEvent()
<span style="font-size:12px;">self.listenTo(core.openflow)</span>
添加对OpenFlow消息的监听
4. addListeners
功能:指定source(EventMixin类的子类)将自身设为subscriber
example:
pox.forwarding.l2_learning.l2_learning.__init__():
core.openflow.addListeners(self)
另一种监听OpenFlow消息的方法