




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用微软消息队列实现使用微软消息队列实现 C 进程间通信进程间通信 2008 07 25 来源 网络 顾名思义 微软消息队列 MSMQ 是一种给队列发送消息以便稍后进行处理的方法 消息由 一个 Producer 生产者 应用程序发送出去 再由一个 Consumer 消费者 应用程序返回 这两个应用程序可以在同一台机器上 在整个网络中 或甚至是位于并不总是连接在一起的不 同机器上 MSMQ 具有故障保险特性 因为如果第一次传送失败 它会重新发送消息 这样可保 证你的应用程序消息到达它们的目的地 我将应用一个叫做 TechRepublic 的队列 当你运行本文下载版本中的样本实例时 如果这个队 列不存在 它会自动建立 在前面的一篇文章中 Zach Smith 说明了如何使用 IPC 通道在同一台机器上的两个进程间通信 他将在本文中说明如何在同一台机器或网络上的应用程序间实现进程间通信 访问 MSMQ 通过 NET 访问队列由 System Messaging MessageQueue 对象完成 列表 A 说明了如何在一台名 为 SRV MESSAGING 的计算机上访问 TechRepublic 队列 列表 A MessageQueue queue new MessageQueue SRV MESSAGINGTechRepublic 注 要应用这个对象 你必须在你的项目中添加一个参考 现在我们有了一个 MessageQueue 对象 这个对象为你提供与队列交互需要的所有功能 如果队列不存在 你可以调用 MessageQueue 对象的静态 Create 方法编程建立队列 列表 B 中 的代码说明如何检查队列是否存在 建立队列或给队列添加一个参考 列表 B MessageQueue queue null string queueName SRV MESSAGINGTechRepublic if MessageQueue Exists queueName queue newMessageQueue queueName else queue MessageQueue Create queueName false 改写队列 改写队列时 用到 MessageQueue Send 方法 列表 C 举例说明如何向 TechRepublic 队列发送一 条消息 列表 C queue Send My message body Message Label 在这个例子中 我们给 TechRepublic 队列发送一条正文为 My message body 的消息 并对这个 消息应用了一个 Message Label 标签 消息标签允许你不需阅读消息正文就可以分割消息 如果 从计算机管理控制台中查看队列 还可在 队列消息 部分看到这些标签 读取队列 可以使用几种方法从队列中读取消息 最常见的情况是从队列中取出所有消息 然后一次性处 理它们 这时要调用 MessageQueue GetAllMessages 方法 列表 D 举例说明如何应用这个方法 列表 D System Messaging Message messages queue GetAllMessages foreach System Messaging Message message in messages Do something with the message 你也可以用 GetMessageEnumerator2 方法代替上面的 MessageQueue GetAllMessages 方法 虽然 这两个方法的用法类似 但 GetMessageEnumerator2 只能向前 forward only 对于非常庞大的 队列 则应用使用这个方法 而不是 MessageQueue GetAllMessages 方法 这是因为 GetAllMessages 方法领取所有消息 把它们保存在当地内存中 而 GetMessageEnumerator2 方法只领取当前消息在本地保存 在调用 MoveNext 时才领取下一条消息 列表 E 举例说明了 GetMessageEnumerator2 方法的用法 这段代码检查队列中的每一条消息 再 删除它 列表 E MessageEnumerator enumerator queue GetMessageEnumerator2 while enumerator MoveNext enumerator RemoveCurrent 在使用 GetMessageEnumerator2 方法时 还要考虑另外一个问题 即你要访问队列中增加的任 何新消息 即使它们是在你调用 GetMessageEnumerator2 后再增加的 这假定新消息被添加到队 列末尾 如果你只希望返回队列中的第一条消息 你应该使用 MessageQueue Receive 方法 这个方法会 领取队列中的第一条消息 在这个过程中将它从队列中删除 由于消息在读取的时候被删除 你 可以确保你的进程是唯一收到消息的进程 Receive 方法的应用实例如列表 F 所示 列表 F System Messaging Message message queue Receive 可以用 Peek 方法代替 Receive 方法 Peek 方法像 Receive 方法一样领取队列中的第一条消息 但是 它在队列中保留消息备份 这允许你从队列中删除消息之前检查消息内容 Peek 的语法与 Receive 类似 列表 G System Messaging Message message queue Peek 发送 接收序列化对象 虽然给队列发送文本的功能非常有用 但队列还允许你发送可序列化对象 这意味着你可以建 立一个自定义的 NET 类 实例化它的一个实例 将其发送给队列以便其它应用程序使用 要完成 这个过程 首先得使用 XML Serializer 序列化被发送的对象 然后对序列化对象放到消息的正文 中 例如 假设我们希望给 TechRepublic 消息队列发送以下对象 列表 H 列表 H Serializable publicclassMessageContent privateDateTime creationDate DateTime Now privatestring messageText public MessageContent public MessageContent string messageText messageText messageText publicstring MessageText get return messageText set messageText value publicDateTime CreationDate get return creationDate set creationDate value 给队列发送这个对象的一个实例只需简单调用 MessageQueue Send 方法 并把一个对象实例作 为参数提交给这个方法 列表 I 说明了这种情况 列表 I MessageContent message newMessageContent Hello world queue Send message Sample Message 如你所见 上面的代码类似于我们前面发送正文为一个字符串的消息时使用的代码 接收一个 包含序列化对象的消息更加困难一些 我们需要告诉消息它包含哪种对象 为向消息指出它包含哪种对象 我们必须建立消息的格式化器 formatter 给消息的 Formatter 属性指定一个 System Messaging XmlMessageFormatter 对象即可建立格式化器 由于我 们的消息包含一个 MessageContent 对象 我们希望为它配置 XmlMessageFormatter 列表 J message Formatter new System Messaging XmlMessageFormatter newType 1 typeof MessageContent 既然我们已经给消息指定了一个格式化器 我们可以从消息中提取 MessageContent 对象 但在 这之前 我们需要把 message Body 属性的返回值分配给一个 MessageContent 对象 列表 K MessageContent content MessageContent message Body 在这个例子中 content 变量是我们向队列发送的原始 MessageContent 对象的序列化版本 我 们可以访问原始对象的所有属性和值 设定消息优先级别 在正常情况下 队列中的消息以先进先出的形式被访问 这表示如何你先发送消息 A 再发送 消息 B 那么队列将首先返回消息 A 然后才是消息 B 在多数情况下 这样处理没有问题 但 是 有时 由于一条消息比其它消息更加重要 你希望将它提到队列前面 要实现这种功能 你 就需要设定消息优先级别 一条消息的优先级别由它的 Message Priority 属性值决定 下面是这个属性的所有有效值 全部 来自 MessagePriority 的列举类型 最高 Highest 非常高 VeryHigh 高 High 高于正常级别 AboveNormal 正常 Normal 低 Low 非常低 VeryLow 最低 Lowest 消息在队列中的位置由它的优先级别决定 例如 假如队列中有四条消息 两条消息的优先 级别为 正常 Normal 另两条为 高 High 则队列中消息排列如下 High Priority A 这是发送给队列的第一条 高 优先级消息 High Priority B 这是发送给队列的第二条 高 优先级消息 Normal Priority A 这是发送队列的第一条 正常 优先级消息 Normal Priority B 这是发送队列的第二条 正常 优先级消息 根据这个顺序 如果我们给队列发送另一条 最高 优先级的消息 它将位于队列的顶部 如果需要使用消息优先级功能 你必须修改发送消息的代码 因为 Message 对象的构造器没有 指定消息优先级别的功能 你必须实例化一个 Message 对象 并在将它发送给队列之前给它设定 相应的属性 列表 L 中的代码说明如何设定优先级别 并给队列发送一条 最高 优先级别的消息 列表 L Instantiate the queue MessageQueue queue newMessageQueue queueName Create a XmlSerializer for the object type we re sending XmlSerializer serializer new XmlSerializer typeof MessageContent Instantiate a new message System Messaging Message queueMessage new System Messaging Message Set the priority to Highest queueMessage Priority MessagePriority Highest Create our MessageContent object MessageContent messageContent newMessageContent Hello world IMPORTANT Serialize the MessageContent object into the queueMessage serializer Serialize queueMessage BodyStream messageContent Send the message queue Send queueMessage HIGH PRIORITY 这段代码和上面代码的最明显区别在于它使用了 XmlFormatter 它实际是可选的 列表 L 中的 代码也可用列表 M 中的代码代替 列表 M Instantiate a new message System Messaging Message queueMessage new System Messaging Message Set the priority to Highest queueMessage Priority MessagePriority Highest Create our MessageContent object MessageContent messageContent newMessageContent Hello world IMPORTANT Set the body as the messageContent object queueMessage Body messageContent Send the message queue Send queueMessage HIGH PRIORITY 这段代码执行和列表 L 中的代码相同的任务 但代码更少 应用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 七台河水泥假山施工方案
- 校园招聘薪酬方案范本
- 工地阶层分工方案范本
- 2025标准版国际贸易合同范本
- 2025年控制测量学试题及答案
- 水下工程打捞施工方案
- 《2025修改合同条款部分内容补充协议书》
- 荆州河道亮化施工方案
- 2025南平延平塔前镇卫生院招聘医师模拟试卷及完整答案详解1套
- 玻纤石膏板施工方案
- 第一单元《精神信仰力量情感》《大路歌》教学设计湘艺版初中音乐八年级上册
- 人教版四年级数学上学期第1单元大数的认识综合素养评价卷(含答案)
- 2025外贸采购合同模板
- 体操保护与帮助课件
- “互联网+”大学生创新创业大赛计划书一等奖
- 工程后期服务的方案(3篇)
- 行政管理毕业论文8000
- 2025年湖南省高考历史真题(原卷版)
- 老年人脑卒中课件
- 2025年传媒行业编辑记者招聘笔试模拟题及答案全解
- 艾青自述 我的创作生涯
评论
0/150
提交评论