默认定义的协议处理函数是echo_xx的方式,但不了解为什么这样定义,翻读firefly.utils.services模块源代码,添加映射是在mapTarget()方法中。
在Service基类中,是所有方法名做为handler的映射:
Service类:
def mapTarget(self, target):
"""Add a target to the service."""
self._lock.acquire()
try:
key = target.__name__ #基类是将整个方法名做为key来处理
if self._targets.has_key(key):
exist_target = self._targets.get(key)
raise "target [%d] Already exists,\
Conflict between the %s and %s"%(key,exist_target.__name__,target.__name__)
self._targets[key] = target
finally:
self._lock.release()
CommandService类:
def mapTarget(self, target):
"""Add a target to the service."""
self._lock.acquire()
try:
key = int((target.__name__).split('_')[-1]) #只取后面的ID为key,前缀可以随意设定,这样设计,猜测函数名可以是“协议名_协议ID",读的时候会容易些吧
if self._targets.has_key(key):
exist_target = self._targets.get(key)
raise "target [%d] Already exists,\
Conflict between the %s and %s"%(key,exist_target.__name__,target.__name__)
self._targets[key] = target
finally:
self._lock.release()