Msmq设计文档(赋源代码)

 

Msmq设计文档

 

 

文件状态:

[√] 草稿

[  ] 正式发布

[  ] 正在修改

文件标识:

ECI-MSMQ v01

当前版本:

0.5

作    者:

阿新

完成日期:

2005-8-18

1.0文档说明:

1.1文档目的

介绍了MSMQ的基本编程(如存储和接收消息)和基本的管理功能(如创建和删除队列)。虽然使用.Net API来是非常方便和简单的,但是在实际的MSMQ项目中,需要了解消息队列作为架构的概念。通过使用MSMQ,系统会更加松散耦合,因此更加自治(autonomous)。需要注意的是:消息仅仅是消息,而不是内部的业务对象。因此,在设计新的分布式应用程序时,建议遵守面向服务架构(Service-Oriented Architecture)的基本思想:通过显式定义边界、创建自治服务,让MSMQ来负责交互部分。

1.2文档范围

涉及居于MSMQ基础的传输信息的交互开发

1.3读者对象

系统设计人员,开发人员,测试人员

1.4参考文献

Msdn Cnblogs

1.5专业术语

1、“消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。消息被发送到队列中。“消息队列(MSMQ)”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。

2、队列类型(Queue Type)

有两种主要的队列类型:由您或网络中的其他用户创建的队列和系统队列。用户创建的队列可能是以下任何一种队列:

“公共队列”在整个“消息队列”网络中复制,并且有可能由网络连接的所有站点访问。

“专用队列”不在整个网络中发布。相反,它们仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的应用程序访问。

“管理队列”包含确认在给定“消息队列”网络中发送的消息回执的消息。指定希望 MessageQueue 组件使用的管理队列(如果有的话)。

“响应队列”包含目标应用程序接收到消息时返回给发送应用程序的响应消息。指定希望 MessageQueue 组件使用的响应队列(如果有的话)。

说明:我们这里用到专用队列;

3、同步和异步通信(Synchronous VS. Asynchronous Communication)

队列通信天生就是异步的,因为将消息发送到队列和从队列中接收消息是在不同的进程中完成的。另外,可以异步执行接收操作,因为要接收消息的人可以对任何给定的队列调用 BeginReceive 方法,然后立即继续其他任务而不用等待答复。这与人们所了解的“同步通信”截然不同。 在同步通信中,请求的发送方在执行其他任务前,必须等待来自预定接收方的响应。发送方等待的时间完全取决于接收方处理请求和发送响应所用的时间

4、同消息队列交互(Interacting with Message Queues)

消息处理和消息为基于服务器的应用程序组件之间的进程间通信提供了强大灵活的机制。同组件间的直接调用相比,它们具有若干优点,其中包括:

稳定性 — 组件失败对消息的影响程度远远小于组件间的直接调用,因为消息存储在队列中并一直留在那里,直到被适当地处理。消息处理同事务处理相似,因为消息处理是有保证的。

消息优先级 — 更紧急或更重要的消息可在相对不重要的消息之前接收,因此可以为关键的应用程序保证足够的响应时间。

脱机能力 — 发送消息时,它们可被发送到临时队列中并一直留在那里,直到被成功地传递。当因任何原因对所需队列的访问不可用时,用户可以继续执行操作。同时,其他操作可以继续进行,如同消息已经得到了处理一样,这是因为网络连接恢复时消息传递是有保证的。

事务性消息处理 — 将多个相关消息耦合为单个事务,确保消息按顺序传递、只传递一次并且可以从它们的目标队列中被成功地检索。如果出现任何错误,将取消整个事务。

安全性 — MessageQueue 组件基于的消息队列技术使用 Windows 安全来保护访问控制,提供审核,并对组件发送和接收的消息进行加密和验证

2类库功能说明

完成将报文以string,stream,xmldocument,dataset的形式发送到指定的消息队列,并接收这些消息还原成报文格式;支持多线程异步方式接收消息;

2.1类库结构

类名称

方法/类型

参数

说明

ECI.MSMQLib

FormatterType

枚举类型

Xml,binary,stream

定义消息序列化类型

MQProfile

Path,transactional…

定义消息队列的基本参数

MsgType

枚举类型

String,stream,dataset,docment

定义消息的类型

MyConvert

ToXmlDoc

dataset

Dataset转化成xmldocuemnt

ToDataSet

xmldocuemnt

xmldocuemnt转化成Dataset

ToStream

Dataset,xmldocument

把DataSet,xmldocuemnt转化成stream

ToString

Stream

将stream转成String

ToString

XmlDocument

将xmldocment转成String

ToString

dataset

将xmldocment转成String

ToBig

Big5

繁体转简体

ToBig5

Big

简体转繁体

MySteam

Read

读取stream中的消息

WriteLog

Save

当msmq发送错误将记录错误信息同时备份下消息内容,发送Mail通知处理人员

MQReceiveDelegate

委托

在采用异步接受时会用到

Sender

Sender

MQProfile

构造函数,初始化消息队列

Send

根据MQProflie的定义发送消息

Lable,Context

发送String;定义消息标签和内容

DataSet,Lable

发送DataSet

Xmldocuemnt,Lable

发送XmlDocuemnt

Stream,Lable

发送Stream

Receiver

Receiver

MQProfile

构造函数,初始化消息队列

Receive

同步接收String

ReceiveXmlDoc

同步接收xmlDcoument

ReceiveDataset

同步接收DataSet

AsynReceive

异步接收消息通过MQReceiveDelegate Receiving获取消息体和标签

AsynReceiveCallBak

异步回调接收消息通过MQReceiveDelegate Receiving获取消息和标签

2.2消息队列的创建

///MQPath = FormatName:DIRECT=TCP:172.20.30.36\Private$\PathName 通过ip方式调用队列

///MQPath = FormatName:Direct=http://localhost/msmq/Private$/PathName 通过http方式调用队列优点可以穿越防火墙的限制;

///MQPath = FormatName:Direct=OS:JACK-FC0647E1EE\\private$\\demo1  本测试在域服务器上,测试通过,网上说此格式只能用于在域中的计算机;

///MQPath = MachineName\Private$\PathName 通过主机名方式调用队列

///创建队列

System.Messaging.MessageQueue mq = new System.Messaging.MessageQueue(this.MQPath);

///创建消息

System.Messaging.Message msg=new System.Messaging.Message();

//msg.Recoverable=true;

/*

Recoverable 属性指示是否保证消息的传递,即使计算机在消息传递到目标队列的途中崩溃。                 如果保证消息的传递,则在途中的每一步都将本地存储消息,直到消息被成功地转发到下一台计算机。将 Recoverable 属性设置为 true 可能会影响吞吐量。 如果消息是事务性的,消息队列会自动将消息视为可恢复的,而与 Recoverable 属性的值无关。

*/

///定义消息的序列化类型

mq.Formatter=new System.Messaging.XmlMessageFormatter(new Type[] {typeof(string)}) ;

msg.Formatter=new System.Messaging.XmlMessageFormatter(new Type[] {typeof(string)}) ;

mq.Formatter=new System.Messaging.XmlMessageFormatter(new Type[] {typeof(DataSet)}) ;

msg.Formatter=new System.Messaging.XmlMessageFormatter(new Type[] {typeof(DataSet)}) ;

///创建一个事务用于对事务性队列的控制

MessageQueueTransaction mqt=new MessageQueueTransaction();

///对消息标签赋值 string

msg.Label=MQlable;

///对消息体赋值 object

msg.Body=Context;

///对以流形式的消息体赋值 stream

msg.BodyStream =stream

try

{

///开始一个发送消息事务

mqt.Begin();

///发送消

mq.Send(msg,mqt);

///成功发送

mqt.Commit();

}

catch(MessageQueueException e)

{

//Log.Save(e.Message);

///回滚整个事物

mqt.Abort();

///将错误信息写入日至

//WriteLog.Save(this.MQPath,"Sender.SendStream(System.IO.Stream stream,string Lable).Transaction",e.Message,MyReadStream.Read(stream));

throw;

}

2.3 读/显示消息

当消息接受后,消息将从队列中删除。可以通过使用MessageQueue.Peek方法来检索消息队列中的第一个消息的复制,保留消息在队列中。不过,这样只能获取的相同的消息。更好的办法是通过foreach来读消息队列中的消息,但不删除队列中的消息。

foreach(System.Messaging.Message message in queue)

{

txtResults.Text += message.Label + Environment.NewLine;

}

2.4 异步接受消息

public void  AsynReceiveCallBak()

{

try

{

//this.MessageType=msgType;

MessageQueueTransaction myTransaction = new                  MessageQueueTransaction();

anycMQ = new MessageQueue(MQpath);

AsyncCallback cb = new AsyncCallback (callback);

IAsyncResult asyncResult=anycMQ.BeginReceive(new TimeSpan(0,0,5,0),DateTime.Now,cb);

//return MQ_OutBox;

}

catch(Exception e)

{

WriteLog.Save(this.MQPath,"Receiver.AsynReceiveCallBak()",e.Message);

throw;

}

}

private   void callback(IAsyncResult handle)

{

Message msg=anycMQ.EndReceive(handle);

try

{

MQcontext=msg.BodyStream;

MQlable=msg.Label;

this.Receiving(this.MQLable,this.MQContext);

this.AsynReceiveCallBak();

}catch

{

……..

}

}

源代码:
http://files.cnblogs.com/neozhu/MSMQLib.rar

出处:http://www.cnblogs.com/neozhu/archive/2005/09/08/232634.html

Msmq设计文档(赋源代码)的更多相关文章

  1. 朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素

    朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素 [下载文本PDF进行阅读] 本文我会来说说我认为架构评审中应该看的一些点,以及我写设计文档的一些心得.助你在架构评审中过五关斩六将,助 ...

  2. Storm项目:流数据监控1《设计文档…

    博客公告: (1)本博客全部博客文章搬迁至<博客虫>http://blogchong.com/ (2)文章相应的源代码下载链接參考博客虫站点首页的"代码GIT". (3 ...

  3. javaweb 课程设计编码和设计文档

    企业办公软件设计文档 1引言 1.1编写目的 OA办公自动化系统详细设计是设计的第三个阶段,这个阶段的主要任务是在OA办公自动化系统概要设计书基础上,对概要设计中产生的功能模块进行过程描述,设计功能模 ...

  4. DDD领域驱动设计 - 设计文档模板

    设计文档模板: 系统背景和定位 业务需求描述 系统用例图 关键业务流程图 领域语言整理,主要是整理领域中的各种术语的定义,名词解释 领域划分(分析出子域.核心域.支撑域) 每个子域的领域模型设计(实体 ...

  5. Atitit.atiagent  agent分销系统 代理系统 设计文档

    Atitit.atiagent  agent分销系统 代理系统 设计文档 1. 启动项目1 2. 首也2 3. 登录功能2 4. 用户中心2 5. 充值查询3 6. 授权下级代理4 7. 我的提成5 ...

  6. Net 通用权限管理系统源码 带数据库设计文档,部署说明文档

    Net 通用权限管理系统源码 带数据库设计文档,部署说明文档 包括数据库设计文档部署安装文档源码数据库文件 下载地址:http://www.mallhd.com/archives/1389

  7. 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  8. Access数据库自动生成设计文档

    在做Access数据库设计时,常常直接在access文件中建表,建字段,然后写设计文档时,又得重新再写一遍字段和表间关系.其实access数据库自己就支持自动生成数据库文档. 操作方法如下: 数据库工 ...

  9. 厨娘ui设计文档

    厨娘ui设计文档 一.概述 中国的饮食文化从古到今源远流长.在生活日益丰富的今天,人们对饮食的要求不仅仅是温饱,更讲究健康和美味.近年来,饮食甚至成为娱乐的一部分,关于吃的流行用语层出不穷,可见在当今 ...

随机推荐

  1. python-day37--concurrent.futures模块 实现进程池与线程池

    1.concurrent.futures模块 直接内置就是 异步的提交   ,如果你想同步也可以实现(p.submit(task,i).result()即同步执行) 2.属性和方法: 1.submit ...

  2. OC MRC之 @property参数(代码分析)

    第一部分 // // main.m // 04-@property参数 // // Created by apple on 13-8-9. // Copyright (c) 2013年 itcast. ...

  3. 【LeetCode】Unique Binary Search Trees II 异构二叉查找树II

    本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4048209.html 原题: Given n, generate all struc ...

  4. BZOJ1907 树的路径覆盖

    ydc题解上写着贪心,后来又说是树形dp...可惜看不懂(顺便骗三连) 其实就是每个叶子开始拉一条链,从下面一路走上来,遇到能把两条链合起来的就合起来就好了. /******************* ...

  5. html和css命名标准以及常用的框架,我使用的是网易nec

    前端的工作很细,涉及的东西也很多,静态页面和js开发,调接口之类,有时还要自己设计.现在css管理使用less和sass,新东西起码要支持下,具体用与不用看公司的业务需求.前端人员之间的配合也很重要要 ...

  6. HDU 2767 Proving Equivalences (Tarjan)

    Proving Equivalences Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other ...

  7. ADO SQL delete 日期条件参数

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  8. selenium(三)浏览器操作

    from time import sleep from selenium import webdriver #定义浏览器是firefox driver=webdriver.Firefox() #页面打 ...

  9. CreateFile DeviceIoControl dwIoControlCode——应用程序与驱动程序通信

    在“进程内存管理器中”的一个Ring0,Ring3层通信问题,之前也见过这样的代码,这次拆分出来详细总结一下. 先通过CreateFile函数得到设备句柄,CreateFile函数原型: HANDLE ...

  10. first head in html 笔记

    目录: 1.了解HTML 2.学会简单构建网页 3.学会将单个的网页放在web上,组成网站 5.学会使用图片 6.严格HTML规范 7.HTML->XHTML 8.学会一点CSS样式 9.了解盒 ...