资源预览内容
第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
亲,该文档总共8页全部预览完了,如果喜欢就下载吧!
资源描述
1Message Driven Model DescriptionRevision HistoryDateVersionDescriptionAuthor10/26/20060.1Initial document creationKun YangTable of Contents1.1MDM 缘起.2 1.2MDM 涉及技术.2 1.3MDM 功能描述.3 1.4MDM 的静态类图.4 1.5MDM 的执行流程.4 1.6MDM 使用手册.5 1.6.1自定义消息.5 1.6.2定义消息的流程.2 1.6.3使 MDM 托管消息队列.2 1.6.4启动 MDM 监控线程.6 1.6.5添加消息到其队列.6 1.6.6测试用例.621.1MDM 缘起缘起一个系统的数据流图演变为消息流图。每一类型的消息都有它自己对应的消息加工模块。一种类型消息流入它的加工处理模块,经过模块的加工处理,转换为另外一系列类型消息。这一系列消息又需要进行它们各自的处理,然后转变为另一些类型的消息。流入系统的消息类型的数量未知。每一类型的消息数量也未知。当有很多种类的消息流入系统并且每一类消息的数量都非常巨大的时候,我们希望系统也能够及时响应流入系统的每一个消息。也就是说,希望每一个消息都能够得到及时的处理。因此,希望能够有一个模型,它独立于所有的业务逻辑。他不依赖于任何的业务逻辑。从理论上讲,所有具有消息驱动特征的系统都可以使用这个模型来解决消息传递和消息处理这些问题。基于以上原因,我们开发了 MDM(Message Driven Model)模型。用图形化来表示上面的需求以及 MDM 的整体框架,如图 1。Process for Msg1Process for Msg4Process for Msg2Process for Msg3Process for Msg5Process for Msg6Msg1Msg2Msg5Msg5Msg6outputoutputMsg3Msg4Message Driven Model4 Threads6 Threads5 Threads3 Threads3 Threads7 Threads110304 messages40309 messages图图 1:MDM 要解决的问题要解决的问题总结,MDM 是一个消息驱动模型。它管理多种消息类型,每种消息类型有一个消息队列,一个消息队列有多个线程来处理它的消息。MDM 动态控制每个消息队列的线程数目,使得每个消息都能够被及时的处理。1.2MDM 涉及技术涉及技术3由于我们的整个系统都使用 ICE 网络中间件。所以 MDM 也使用了 ICE 提供的部分技术。这些技术由 Ice Run Time 提供。我们使用这些 ICE 提供的技术减少了编码量,不过同时也增加了 MDM 模型对 ICE 的依赖,但是这个依赖也使得 MDM 模型与平台无关。我们没有使用 ICE 的 Slice,因为 MDM 内部不需要进行网络通信。具体说,MDM 使用了如下的一些技术:1 OOPL:C+ 以及标准模板库(STL) 。2 多线程技术。使用 ICE 封装后的线程,基于 IceUtil:Thread, IceUtil:Monitor。3 使用智能指针避免内存泄露/资源泄露。基于 IceUtil:Handle。4 垃圾回收机制。基于 IceUtil:Shared, IceInternal:GC。1.3MDM 功能描述功能描述1 每一类型的消息都有他自己的消息队列。有多少类型的消息就有多少数量的消息队列。2 每一类型的消息都有他自己的处理流程。这个处理流程将这类消息转换为其他一系列的消息。3 每一个类型的消息都有一定数量的线程处理他的消息队列里的消息。线程的数量由MDM 动态的分配。4 可以允许客户1为每类消息的消息队列配置最初启动的线程数目。注:1 客户:指使用 MDM 代码的人,或者使用 mdm 的其他代码。5 可以允许客户为每类消息的消息队列配置最大能够创建的线程数目。6 可以允许客户为每类消息的消息队列的线程预设能够及时响应的消息数目。 、7 MDM 模型有一个线程来监控所有类型消息的消息队列。监控每一个消息队列是否需要创建线程,是否需要唤醒线程等等,也就是动态分配线程。8 可以允许客户为监管线程设置监管消息队列的时间间隔。如果不设置,那么取默认值。9 MDM 根据预先设置的参数(第 4,5,6 条)来动态创建线程。如果没有设置这些参数,MDM 使用一些默认值,默认值也是可以配置的。当消息队列中有消息需要处理,如果有等待的线程,唤起等待的线程处理消息;如果没有,就动态的创建线程。具体的动态分配线程机制如下:a)如果当前工作的线程已经超过配置的最大线程数,那么不能创建线程;b)如果消息队列为空,那么不需要创建线程;c)如果没有工作的线程,那么创建一个线程;d)如果消息队列的消息数目大于每个线程能够及时响应的消息数目乘以当前工作的线程,并且条件 a)不满足,那么创建一个线程。伪码描述如下:4IF MsgQueue.Size ThreadAbilityNum * WorkingThreadNumAND WorkingThreadNum Using namespace MsgDrivenModel;class ProcessOne :public Process public: ProcessOne():Process();ProcessOne();MsgObjectPtrExecute(const MsgObjectPtr msg) assert(msg); return new MessageTwo(2, msg-get(); ;class ProcessTwo :public Process public: ProcessTwo():Process();MsgObjectPtrExecute(const MsgObjectPtr msg) assert(msg); return new MessageThree(3, msg-get(); ProcessTwo();1.6.3使使 MDM 托管消息队列托管消息队列代码如下: MsgManagerPtr manager = MsgManager:getInstance() ; / ProcessOne *process_1 = new ProcessOne(); / 消息的处理流程 QueueManager *msg_1_manager = new QueueManager(1, process_1, manager.get(), 0, 600, 3); manager -addQueue(msg_1_manager);消息类型的 处理流程预先设置的 一些值6如果要托管更多的消息队列,那么只需要 new 多个 QueueManager 并且把他添加到 MsgManagerPtr 的实例中。1.6.4启动启动 MDM 监控线程监控线程和启动一般线程一样。 MsgManager:getInstance() -start();1.6.5添加消息到其队列添加消息到其队列一个典型的例子如下:for (int i = 0; i addMsg(msg);1.6.6测试用例测试用例我们的测试用例的所有消息定义在:消息定义在:MessageTypes.h 文件中文件中。我们的所有处理流程定义在:处理流程定义在:Processes.h 中中。我们的测试用例 main 在文件:在文件:TestMain.cpp 中中。我们的测试用例子也是依照上面的方法进行。我们的测试用例中的消息流图如图 2:Process for Msg1Process for Msg2Msg1Msg2Process for Msg3Msg3Process for Msg4Msg4OutputMsg4Msg4消息的 类型托管这个消 息队列7图图 3:测试用例中的消息流图:测试用例中的消息流图我们的消息流中,只有一种消息 MessageOne 的输入,但是经过了 4 个加工,最后变成 MessageFour 输出。可以看到,MDM 只用获取输入,就多线程地,透明地在 MDM 内部实现了所有消息的加工,最后将结果输出。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号