日常生活中,我们是倾向于主动地去探测某件事情是否发生,还是更加偏爱事件发生时得到及时的通知呢?我想很多人都会和我一样,更喜欢被动地得到通知,这不能说我们懒惰,而是因为通知的效率比轮询要高。至于为什么高,自己去分析吧...
通知机制在服务器状态的监控中应用得也比较广泛,很多系统都有一个监控进程/服务器监控其它服务的状态,一旦发现服务器状态发生了改变,就及时地将信息反馈给管理员。当管理员收到相关信息后,就能迅速对问题做出反映,改善服务的质量。
比较常用的通知机制就是电子邮件(email),但是电子邮件提供的并不是即时通信服务,所以它的时效性也相应地差了点儿。一篇
文章中提到基于即时通信协议的通知机制,感觉其相对于电子邮件优越性十分明显。可惜的是,jabber和很多古老的即时通信协议一样,并不支持离线消息(如果错了,请更正),目前可以把电子邮件和jabber结合起来以做到优势互补。除了jabber,即时通信协议还有很多,比如MSN和QQ等,只不过因为他们都是封闭协议,相关开源实现的可靠性和兼容性可能相对差些。另外,实际应用的还有手机短信、语音提醒等其它形式的通知机制,他们都可以按照实际情况选用。
在试用通过基于jabber协议的发送消息的过程中,用所谓的面向对象设计方式实现了一个叫作GtalkClient的类(class):
#!/bin/env python
import xmpp
import sys
class GtalkClient(xmpp.Client):
def __init__(self, username, password, resource = "Gtalk"):
# dirty hack
self.Namespace = "jabber:client"
self.DBG = ""
xmpp.Client.__init__(self, "gmail.com", debug = [])
self.connect(("talk.google.com", 5223))
self.auth(username, password, resource)
def sendMessage(self, peer, body):
self.send(xmpp.Message(peer, body))
if __name__ == "__main__":
clnt = GtalkClient("xiaosuo", "***")
clnt.sendMessage("id@gmail.com", "message")
|
细心的可能发现GtalkClient的构造函数__init__中,在其父类xmpp.Client之前的两行代码有些奇怪,不太符合人们对类的认知:父类的构造函数先于子类的运行,self应该是由父类创建并初始化的,在这之前,不能对self进行操作。但是上述代码中对于self的Namespace和DBG的赋值是不可或缺的,不然会在运行时发生如下错误:
xiaosuo@gentux test $ ./gtalk.py
Traceback (most recent call last):
File "./gtalk.py", line 19, in ?
clnt = GtalkClient("xiaosuo", "***")
File "./gtalk.py", line 11, in __init__
xmpp.Client.__init__(self, "gmail.com", debug = [])
File "/usr/lib/python2.4/site-packages/xmpp/client.py", line 99, in __init__
self.defaultNamespace=self.Namespace
AttributeError: GtalkClient instance has no attribute 'Namespace'
|
在Google上搜了老半天都没有找到答案,最终在xmpppy的库中找到了如下代码:
File: /usr/lib/python2.4/site-packages/xmpp/client.py
97 if self.__class__.__name__=='Client': self.Namespace,self.DBG='jabber:client',DBG_CLIENT
98 elif self.__class__.__name__=='Component': self.Namespace,self.DBG=disp atcher.NS_COMPONENT_ACCEPT,DBG_COMPONENT
|
类xmpp.CommonClient作为类xmpp.Client和xmpp.Component的父类,竟然反过来需要根据子类的名字调整自己的行为,怪异得很啊!这绝对是反常的“技巧”,无奈也只能添加了上述两行代码,用hack的方式完成了GtalkClient类。
阅读(1954) | 评论(0) | 转发(0) |