Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2006898
  • 博文数量: 369
  • 博客积分: 10093
  • 博客等级: 上将
  • 技术积分: 4271
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-21 00:59
文章分类

全部博文(369)

文章存档

2013年(1)

2011年(2)

2010年(10)

2009年(16)

2008年(33)

2007年(146)

2006年(160)

2005年(1)

分类:

2007-04-20 23:18:38

日常生活中,我们是倾向于主动地去探测某件事情是否发生,还是更加偏爱事件发生时得到及时的通知呢?我想很多人都会和我一样,更喜欢被动地得到通知,这不能说我们懒惰,而是因为通知的效率比轮询要高。至于为什么高,自己去分析吧...

通知机制在服务器状态的监控中应用得也比较广泛,很多系统都有一个监控进程/服务器监控其它服务的状态,一旦发现服务器状态发生了改变,就及时地将信息反馈给管理员。当管理员收到相关信息后,就能迅速对问题做出反映,改善服务的质量。

比较常用的通知机制就是电子邮件(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类。
阅读(1900) | 评论(0) | 转发(0) |
0

上一篇:睡在我下铺的兄弟

下一篇:王开源事件

给主人留下些什么吧!~~