2008年4月1日星期二

subscription in JADE

花了一个下午的时间来研究JADE中的subscription如何使用,看文档不明白,又在邮件列表里找以往的相关主题,还是不清不楚,最后使出绝招——浏览源码,总算是整明白了~~
其实Subscription协议本身很简单,就是对JADE中提供的Subscription Initiator/Responder如何使用不太明白。综合各方面的资料,现在总结如下:
  1. Subscription Initiator挺简单的,和其他的Initiator类似,只要重载handleInform函数就可以了(对我来说)。这个行为一直开着,直到感觉不需要了,就调用一下cancel函数,哈哈,始乱终弃~~
  2. Subscription Responder就有些不一样了,它也是一直开着,不过当来了一个Subcription,它只是调用Subscription Managerregister函数,然后就不管了,继续等待新的Subcription。当来了一个cancel,它也是包装成一个Subcription,然后调用Subscription Managerderegister函数,然后就不管了。而这个Subscription Manager只是一个接口,所有实现都要由开发者(也就是我)来完成。靠,太不负责了吧!
  3. 根据邮件列表上兄弟的提示,如果Subscription里申请了多个服务,又不想一起实现,那最好就是用多个SM来管理了。可SR默认就是调用构建时传入的SM,怎么办呢?这时可以用主从的结构来实现。用主SM构建SR,在register函数里调用各个子SM的register函数,从而达到根据Subscriptioncontent分别注册管理的目的。解除注册的过程与此类似。
  4. 如何向SI发送Inform消息是让我很困惑的一件事情,文档里的说明只是让我更困惑!还好我们有源码,看了就明白了:)原来关键就是Subscription类了!注册时会传入一个Subscription参数,这个参数应该被SM保存下来,在条件满足要向SI发送消息时就调用这个Subscriptionnotify函数,传入要发送的消息,后面的事就不用我们管了~~
看明白后就简单多了,原来InfoProvider里的结构要大改了,不过这次确实是简化了代码,减轻了工作量,嗯,看源码数小时,写代码数分钟,就是这种感觉~~

1 条评论:

刀巴虫子 说...

昨天看JADE的邮件列表上说Subscription有新的变化了,不过还是向前兼容的,暂时不管变化了,先按以前看的来写代码。
由于有些请求是时间触发的,因此有必要在InfoProvider里添加接收TSM时钟信息的行为,这个行为仅接收stepOpen消息,不需要向TSM发送stepDone的消息。这个行为在接收到stepOpen消息后,会遍历所有的时间触发和事件触发请求,检查是否有满足条件的,若有则发出Inform消息。