Msmq设计文档(赋源代码)
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设计文档(赋源代码)的更多相关文章
- 朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素
朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素 [下载文本PDF进行阅读] 本文我会来说说我认为架构评审中应该看的一些点,以及我写设计文档的一些心得.助你在架构评审中过五关斩六将,助 ...
- Storm项目:流数据监控1《设计文档…
博客公告: (1)本博客全部博客文章搬迁至<博客虫>http://blogchong.com/ (2)文章相应的源代码下载链接參考博客虫站点首页的"代码GIT". (3 ...
- javaweb 课程设计编码和设计文档
企业办公软件设计文档 1引言 1.1编写目的 OA办公自动化系统详细设计是设计的第三个阶段,这个阶段的主要任务是在OA办公自动化系统概要设计书基础上,对概要设计中产生的功能模块进行过程描述,设计功能模 ...
- DDD领域驱动设计 - 设计文档模板
设计文档模板: 系统背景和定位 业务需求描述 系统用例图 关键业务流程图 领域语言整理,主要是整理领域中的各种术语的定义,名词解释 领域划分(分析出子域.核心域.支撑域) 每个子域的领域模型设计(实体 ...
- Atitit.atiagent agent分销系统 代理系统 设计文档
Atitit.atiagent agent分销系统 代理系统 设计文档 1. 启动项目1 2. 首也2 3. 登录功能2 4. 用户中心2 5. 充值查询3 6. 授权下级代理4 7. 我的提成5 ...
- Net 通用权限管理系统源码 带数据库设计文档,部署说明文档
Net 通用权限管理系统源码 带数据库设计文档,部署说明文档 包括数据库设计文档部署安装文档源码数据库文件 下载地址:http://www.mallhd.com/archives/1389
- 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)
郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...
- Access数据库自动生成设计文档
在做Access数据库设计时,常常直接在access文件中建表,建字段,然后写设计文档时,又得重新再写一遍字段和表间关系.其实access数据库自己就支持自动生成数据库文档. 操作方法如下: 数据库工 ...
- 厨娘ui设计文档
厨娘ui设计文档 一.概述 中国的饮食文化从古到今源远流长.在生活日益丰富的今天,人们对饮食的要求不仅仅是温饱,更讲究健康和美味.近年来,饮食甚至成为娱乐的一部分,关于吃的流行用语层出不穷,可见在当今 ...
随机推荐
- Jersey 2.x 基于 Servlet 的服务器端应用
下面的依赖通常应用到应用服务器上(servlet 容器),同时这个应用服务器上没有整合任何 JAX-RS 的实现. 因此,这个应用服务器需要包含有 JAX-RS API 和 Jersey 实现,同时部 ...
- Bug in Code CodeForces - 420C (计数,图论)
大意: 给定$n$结点无向图, 共n条边, 有重边无自环, 求有多少点对(u,v), 满足经过u和v的边数>=p 可以用双指针先求出所有$deg_u+deg_v \ge p$的点对, 但这样会多 ...
- zzuli 1432(二进制特点)
1432: 背包again Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 222 Solved: 65 SubmitStatusWeb Board ...
- ADO.NET 体系结构
两个部分 .NET 数据提供者 DataSet 数据提供者 SqlClient 提供者 OleDb 提供者 Odbc 提供者 数据提供者组件 数据对象 DataSet
- 使用POI导入EXCEL报java.lang.IncompatibleClassChangeError
使用POI导入xls格式的excel报java.lang.IncompatibleClassChangeError异常,而导入xlsx正常. oracle.apps.fnd.framework.OAE ...
- iOS UI-QQ聊天布局
一.Model BWMessage.h #import <Foundation/Foundation.h> typedef enum{ BWMessageMe = ,//表示自己 BWMe ...
- POJ 3176 Cow Bowling(dp)
POJ 3176 Cow Bowling 题目简化即为从一个三角形数列的顶端沿对角线走到底端,所取得的和最大值 7 * 3 8 * 8 1 0 * 2 7 4 4 * 4 5 2 6 5 该走法即为最 ...
- window8服务器
安装PHP集成环境:XAMPP cmd下查看端口号: 如果直接输入netstat -nao 报不是内部指令的处理方法: c:\WINDOWS\system32\netstat -nao 就可以了. w ...
- delete symlink in subversion using svn delete command
# svn delete etc/systemd/system/getty.target.wants/serial-getty@ttyS3.service@ D etc/systemd ...
- prayer OJ M
这一题是一把辛酸泪啊...一个半小时ac的... 首先,考虑到如果要一条路径最小,那么肯定是没有值大于等于3的 显然如果有一个大于等于3的,那么这个数把路径分成两份,一份有k个,一个n-k-1个 那么 ...