Net消息队列学习(二)
NET下RabbitMQ实践[示例篇]
![NET下RabbitMQ实践[示例篇]](https://img.taocdn.com/s3/m/fa96580cc381e53a580216fc700abb68a982ad88.png)
NET下RabbitMQ实践[⽰例篇]在上⼀篇⽂章中,介绍了在window环境下安装erlang,rabbitmq-server,以免配置⽤户,权限,虚拟机等内容。
今天将会介绍如果使⽤rabbitmq进⾏简单的消息⼊队,出队操作,因为本⽂演⽰的环境要⽤到上⽂中配置的环境,所以要运⾏本⽂sample,请先按上⼀篇中完成相应环境配置。
⾸先,我们下载官⽅的.net客户端软件,链接:/dotnet.html下载并安装之后,将安装⽬录下的这两个DLL⽂件复制到我们⽰例项⽬中,并添加引⽤:RabbitMQ.Client.dll //基于的发布订阅消息的功能类RabbitMQ.ServiceModel.dll //包括基于WCF⽅式发布订阅服务模型类如下图:接着,我们创建两个类,⼀个是ProducerMQ.cs(⽤于产⽣消息),⼀个是CustmerMq.cs(⽤于消费消息),代码如下:⾸先是ProducerMQ:public class ProducerMQ{public static void InitProducerMQ(){Uri uri = new Uri("amqp://10.0.4.85:5672/");string exchange = "ex1";string exchangeType = "direct";string routingKey = "m1";bool persistMode = true;ConnectionFactory cf = new ConnectionFactory();erName = "daizhj";cf.Password = "617595";cf.VirtualHost = "dnt_mq";cf.RequestedHeartbeat = 0;cf.Endpoint = new AmqpTcpEndpoint(uri);using (IConnection conn = cf.CreateConnection()){using (IModel ch = conn.CreateModel()){if (exchangeType != null){ch.ExchangeDeclare(exchange, exchangeType);//,true,true,false,false, true,null);ch.QueueDeclare("q1", true);//true, true, true, false, false, null);ch.QueueBind("q1", "ex1", "m1", false, null);}IMapMessageBuilder b = new MapMessageBuilder(ch);IDictionary target = b.Headers;target["header"] = "hello world";IDictionary targetBody = b.Body;targetBody["body"] = "daizhj";if (persistMode){((IBasicProperties)b.GetContentHeader()).DeliveryMode = 2;}ch.BasicPublish(exchange, routingKey,(IBasicProperties)b.GetContentHeader(),b.GetContentBody());}}}}下⾯对上⾯代码进⾏说明:1. 定义要链接的rabbitmq-server地址(基于amqp协议):Uri uri = new Uri("amqp://10.0.4.85:5672/");2. 定义交换⽅式string exchange = "ex1";string exchangeType = "direct";string routingKey = "m1";说明:rabbitmq交换⽅式分为三种,分别是:Direct Exchange – 处理路由键。
.NET消息处理及其应用研究

・ 0・ 4
钢 铁 技 术
2 0 第 6期 0 7年
.
N T消息处理及其应用研 究 E
陈 翔
重庆 40 1) 0 0 3 ( 中冶赛迪公司 自动化事业部,
【 摘
要】 介绍 了, E 消息队列数据交换机制 以及 实际应用要 点. NT
消 息优 先级 :可 以指 定发 送消 息 的优 先 级 , 脱 机 能力 :发送 消息 时,它们 可被 发送 到 临
事 务性 处理 :将 多 个 相关 消息耦 合 为单 个 事
然后生成为一个 D L L 供其他应用模块 引用 。通过实
例 化 这个 自定义类 , 且将它作 为一 个对象 O j c 并 be t 通 过 消息 队列传送 ,就 能实现 自定义 数据 的打 包传
脱机 能力 、事 务性处 理 等优 点 。
・
稳 定 性:组件 失败对 消息 的影 响程消息存储 在 队列 中并一 直在那 里 ,直到 被适 当地 处 理 。
・
制 事件 。 可用 任何 .e Nt开发语 言 C/ +/ B等来 定 #C + V 义 ,不用 担 心应用 模 块使用 的是 不 同的. e 语 言 。 Nt
也可 以更 复 杂 ,可 以包 含嵌 入对 象 。消 息也可 以只
务 ,确保 消 息按 顺序 地通 过传 递一次 即可 ,如 果 出
现 任何错 误 ,将取 消整 个 事务 。
2 ; 息处 理 应用 分析 i 4
在本机 传 送 。 “ 息 队列 (e s g u u ) 消 M s a e Q e e ”是 在 消 息 的传 输过程 中保存 消息的容 器 ,消 息被发送 到 队列 中 。 队列 的主 要 目的是提 供 路 由并保 证消 息 的传 递 ;如 果 发 送 消 息 时接 收 者 不可 用 , 消 息 队列 会 保 留 消 息,直 到可 以成功地 传递 它 。
Net程序设计知识点

.Net程序设计教材:《Visual C# .NET实用教程》,清华大学出版社参考书:课程学习的目的:1学习并掌握.NET技术、C#的编程方法和面向对象思想;2.学习并掌握技术及Windows数据库应用程序的开发;3.学习并掌握技术及Web应用程序的开发;4.学习并掌握网络编程的知识前期课程基础:数据结构、操作系统、计算机网络授课学时与分配:总学时40学时1.绪论(2学时)2.C#的编程基础(2学时)3.面向对象编程(6学时)4.Windows应用程序(4学时)5.技术(2学时)6.Windows数据库应用程序的开发(4学时)7.技术(4学时)8.Web应用程序的开发(3学时)9.网络编程基础(4学时)10.网络编程技术(6学时)11.总结考试(2学时)授课时间、地点:时间为每周一上午8:00—12:10;地点为12教学楼A408,B304。
第1讲.NET综述1.1 .NET介绍1.2 .NET核心成分简介1.2.1公共语言运行库1.2.2 .NET Framework类库1.2.3 中间语言和程序集1.2.4 公共语言规范1.2.5 通用类型系统1.3 开发工具及C#语言1.3.1 开发工具介绍1.3.2 C#语言简介1.4 基于.NET的应用程序1.4.1 SDK和IDE1.4.2 基于.NET的应用程序1.5 C#程序设计初步1.5.1 在SDK上开发控制台程序1.5.2 在IDE上开发Windows应用程序1.5.3 在IDE上开发Web应用程序第2讲C#类型和语句成分2.1关键字、标识符和注释2.1.1 关键字2.1.2 标识符及其命名2.1.3 注释2.2 C#类型基础2.2.1 类型分类2.2.2 C#语言的类型系统2.2.3 变量2.2.4常量和文字2.3 值类型2.3.1简单类型2.3.2枚举类型2.4 数组类型2.4.1 一维数组2.4.2多维数组2.4.3 交错数组2.4.4 Array类简介2.4.5 foreach语句2.5 字符串常量2.5.1 创建字符串2.5.2 String字符串的比较2.6 结构2.6.1 结构的声明2.6.2 结构的实例化及应用2.7运算符和表达式2.7.1 算术运算符2.7.2 关系运算符2.7.3 逻辑运算符2.7.4 位运算符2.7.5 赋值运算符2.7.6 条件运算符2.7.7 运行符的优先级及结合性2.8 数据类型转换2.8.1隐式类型转换2.8.2 显示转换第3讲C#语句3.1 简单语句3.1.1 表达式语句3.1.2 空语句3.1.3复合语句3.1.4 声明语句3.2 选择语句3.2.1 条件运算符3.2.2 if语句3.2.3 switch语句3.3 循环语句3.3.1 while循环3.3.2 do_while循环3.3.3 for循环3.4 跳转语句3.4.1 break语句3.4.2 continue语句3.4.3 goto 语句3.4.4 return 语句3.5 命名空间3.5.1命名空间声明3.5.2 using 命名空间指令3.5.3 using别名指令第4讲面向对象程序设计基础-类、对象、方法4.1 面向对象程序设计概述4.2 类和对象4.2.1 类的声明4.2.2 类的成员4.2.3 对象的声明4.3 构造函数4.3.1 默认构造函数4.3.2 构造函数的重载4.4 析构函数4.5 方法4.5.1 方法的声明及调用4.5.2 方法中的参数传递4.5.3 实例方法和静态方法4.5.4 方法重载4.6运算符重载4.7属性和索引器4.7.1 属性的声明和使用4.7.2 索引器的声明和使用4.7.3 属性和索引器的比较第5讲面向对象程序设计-继承、多态5.1 类的继承5.1.1 基类与派生类5.1.2 成员的继承、添加和隐藏5.1.3 base关键字5.2 抽象类与封闭类5.2.1 抽象方法、属性、索引器5.2.2 抽象类5.2.3 密封类5.3 多态5.3.1 虚成员5.3.2 重写5.3.3 编译时多态和运行时多态第6讲面向对象程序设计-接口、委托1 接口.1 接口的定义.2 接口的实现2委托和事件1 委托2 事件3 异常处理1 异常类2 异常处理步骤3 抛出异常4 捕获处理异常第7讲Windows应用程序7.1 Windows应用程序开发步骤7.1.1创建窗体7.1.2 添加控件及控件布局7.1.3 响应事件7.2 Windows常用控件7.2.1 文本类控件7.2.2 按钮类控件7.2.3 对话框类控件7.2.4 列表框、视图类控件7.2.5 滚动类控件7.2.6 工具栏和状态栏控件7.2.7 定时器控件7.2.8 菜单控件7.3多文档界面(MDI)7.3.1 创建MDI父窗体7.3.2 创建MDI子窗体7.3.3 确定活动的MDI子窗体7.3.4 排列子窗体7.4 实例解析第7讲数据库访问技术8.1 概述8.2 体系结构8.2.1 的总体结构8.2.2 DataSet结构8.2.3 .NET Framwork数据提供程序8.2.4 开发数据库应用程序的一般步骤8.3数据库的连接8.3.1 Connection连接字符串8.3.2 创建并使用连接对象8.4 Command对象的使用8.4.1 创建Command对象8.4.2 执行命令8.4.3 参数化查询8.4.4 执行存储过程8.5 DataReader对象的使用8.5.1 创建DataReader对象8.5.2 使用DataReader读取数据8.6 DataSet和DataAdapter的使用8.6.1 DataSet对象管理数据8.6.2 使用DataAdapter对象第9讲Windows数据库应用程序开发9.1数据绑定9.1.1 简单数据绑定9.1.2 复杂数据绑定9.2数据源的类型9.2.1 数组数据源9.2.2 数据表数据源9.2.3 数据集数据源9.3 Windows数据库应用实例9.3.1数据库的创建及连接9.3.2主要界面及相关代码第10讲 技术10.1 简介10.1.1 的特点10.1.2 代码分离技术10.1.3 Web窗体10.2 控件10.2.1 HTML服务器控件10.2.2 Web服务器控件10.2.3验证控件10.3 内置对象10.3.1 Response对象10.3.2 Request 对象10.3.3 Server对象10.3.4 Session对象10.3.5 Application对象第11讲Web应用程序开发基础11.1 Web数据绑定技术11.2 列表类数据绑定控件11.2.1 列表控件概述11.2.2 列表类控件数据绑定举例11.3 GridView控件11.3.1 GridView控件概述11.3.2 常用属性、方法和事件11.3.3 GridView中的字段类型11.3.4 GridView数据显示11.3.5编辑和删除数据11.3.6 分页显示数据和数据排序11.4 Global.asax文件11.5 Web.config文件11.5.1 配置与调用数据库链接字符串11.5.2 配置文件Web.config第12讲网上选课系统的开发12.1需求分析12.2数据库设计12.2.1 数据库表12.2.2 存储过程12.3系统设计12.4数据库连接12.4.1 Web.Config的配置12.4.2 调用连接字符串12.5 系统实现12.5.1 登录界面(Login/Login.aspx)12.5.2 选课界面(student/selectcourse.aspx)12.5.3 提交界面(student/tijiao.aspx)12.5.4 学生管理界面(manager/StudentList)12.5.5 选课管理界面(manager/XuanKeList.aspx)以上为考试范围第13讲多线程和同步13.1 基本概念13.1.1多线程概念13.1.2 C#中线程实现方法13.2 Thread类13.2.1 Thread类介绍13.2.2 线程的状态和生命周期13.2.3 线程的优先级13.3多线程编程13.3.1 编程步骤13.3.2 编程实例13.4线程同步和互斥13.4.1多个线程同时修改共享数据可能发生的错误13.4.2 用Lock语句实现互斥13.4.3 用Mutex类实现互斥13.4.4 用Monitor类实现互斥13.5 实例解析第14讲网络协议与套接字编程14.1 TCP/IP网络协议14.1.1 TCP/IP参考模型14.1.2网间协议IP14.1.3 传输控制协议TCP14.1.4 C#中相关的类14.2套接字编程技术14.2.1 IP地址和端口14.2.2 套接字14.2.3 面向连接的套接字14.2.4无连接的套接字14.3 套接字编程实例1、.Net包括哪些内容?主要介绍.NET的两个重要实体:公共语言运行库(Common Language Runtime,CLR)和.NET Framework类库(Framework Class Library,FCL),以及其它核心成分。
.NET平台常见技术框架整理汇总

.NET平台常见技术框架整理汇总使⽤.NET平台开发有段时间了,在⽹上资料的基础上做了进⼀步整理,汇集了.NET平台常见的技术框架。
参考资料:1.知识⽹络2.分类清单名称说明地址Windows ServerAppFabric微软⾃家分布式缓存服务框架, 扩展了 Windows Server 为 Web 应⽤程序和中间层服务提供增强的托管、管理和缓存功能Memcahed⾼性能的分布式内存对象缓存系统。
它基于⼀个存储键/值对的hashmap,通过在内存中缓存数据和对象来减少读取数据库的次数,从⽽提⾼动态、数据库驱动⽹站的速度。
Redis使⽤ANSI C语⾔编写、⽀持⽹络、可基于内存亦可持久化的⽇志型、Key-Value数据库,并提供多种语⾔的APINCache基于NGINX的Web服务器构建起来的缓存系统,适⽤于需要快速部署、⼤并发量、⼤存储量的需求2.2.应⽤框架名称说明地址Boilerplate基于领域驱动的开源Web开发框架Orchard国外⼀个MVC开源的博客系统。
DasBlog国外⼀个基于的博客系统国外⼀款免费开源的博客系统。
⼀套⾮常优秀的基于的开源门户⽹站程序。
国内开源的论坛社区系统。
nopCommerce和Aspxcommerce国外⼀套⾼质量的开源B2C⽹站系统。
DTCMS国内两款开源的⽹站管理系统2.3.⽇志记录异常处理名称说明地址Log4Net轻量级的免费开源.NET⽇志记录框架。
Enterprise Library LogApplication Black微软企业库⽇志记录。
Elmah实现最流⾏的应⽤异常⽇志记录框架。
NLog简单灵活的⽇志记录类库,性能⽐Log4Net⾼,使⽤和维护难度低。
Essential Diagnostics为内置System.Diagnostics 命名空间扩展功能,提供更灵活的⽇志功能。
官⽹Logary mono 和 .Net 平台下⾼性能、多⽬标的⽇志、度量、追踪和健康检查库。
easynetq 用法 -回复

easynetq 用法-回复标题:深入理解与使用EasynetQEasynetQ是一个基于.NET的高级MQ(消息队列)接口,它提供了与RabbitMQ的无缝集成。
在高并发、分布式系统中,消息队列是一种非常重要的组件,它可以有效地解耦系统、提高系统的稳定性和扩展性。
本文将详细介绍EasynetQ的使用方法和步骤。
一、安装EasynetQ首先,我们需要在项目中安装EasynetQ。
如果你的项目是通过NuGet 管理包的,你可以直接在Package Manager Console中输入以下命令进行安装:bashInstall-Package EasyNetQ这将会下载并安装EasynetQ及其所有依赖项。
二、连接到RabbitMQ安装完EasynetQ后,我们就可以开始连接到RabbitMQ服务器了。
以下是一个基本的连接示例:csharpusing EasyNetQ;var bus = RabbitHutch.CreateBus("host=localhost");在这个例子中,我们使用了RabbitHutch类的CreateBus方法来创建一个IBus实例,这个实例是我们与RabbitMQ交互的主要接口。
参数"host=localhost"指定了RabbitMQ服务器的地址。
三、发布消息有了IBus实例后,我们就可以开始发布消息了。
以下是一个简单的发布消息的例子:csharpusing EasyNetQ;var bus = RabbitHutch.CreateBus("host=localhost");bus.Publish(new MyMessage { Text = "Hello, world!" });在这个例子中,我们调用了IBus实例的Publish方法来发布一个MyMessage类型的对象。
这个对象将被发送到RabbitMQ服务器,并可以被订阅了相应消息类型的消费者接收。
消息队列各种比较

消息队列各种比较/archimedes_zht/article/details/740121 0最近的工作需要用到MessageQueue来做“任务分发”,自己写了一个简单的,但是感觉不够满意。
主要还是感觉消息队列持久化要做的好很难,还有各种异常情况等等,短时间开发一个,挑战很大,还是找一个开源的实现吧。
先是找到了RabbitMQ,是erlang写的,而我们的系统是用Go写的,目前它还没有Go的绑定,部署系统的时候也要装erlang虚拟机。
考察了之后决定放弃。
然后是最近大名鼎鼎的ZeroMQ,第一次听说是在云风大哥的博客上(/2011/02/zeromq_message_p atterns.html),我后来在还没有用它写代码之前就分析过它的源码了(/archimedes_zht/article/details/73429 37,/docs:omq-2-1-class-diagram)。
:D 分析代码的时候就知道它没有分发任务、执行任务时候的各种确认,任务的持久化以防止任务丢失。
不过ZeroMQ可以把内存中放不下的消息先写到磁盘上去,然后再读进内存(见swap_t类)。
这次再大致看了下它的文档,可以确认它的名字虽然是MQ,但是它提倡的是“结构化网络编程”,它建立了非常灵活的编写网络程序的基础设施,可以用在各种场合,不过这些场合都需要你自己利用它提供的基础设施来定制(比如我现在急切需要的各种任务分发相关的特性)。
目前知道的是它可以创建一个queue的device。
不过这个目前和我的“任务分发”需求相差很远。
以后有空再研究这个精彩的、雄心勃勃的项目吧。
然后是Gearman(/),它是专门做任务分发的。
任务可以分为前台任务(同步任务)和后台任务(异步任务),而且提供了任务的持久化机制(配置一个数据库就行了,支持MySQL,Sqlite3等),非常符合我的胃口。
:) 而且mikespook大侠已经提供好了Gearman协议的Golang实现(/2011/05/go-%E8%AF%AD% E8%A8%80%E7%9A%84-gearman-api/)代码也实现的非常漂亮,学习了。
easynetq 用法

easynetq 用法EasyNetQ是一个.NET的消息队列库,它支持RabbitMQ,一个流行的开源消息队列系统。
使用EasyNetQ与RabbitMQ进行交互的基本步骤如下:1. 安装EasyNetQ库:首先,你需要在你的项目中安装EasyNetQ库。
你可以通过NuGet包管理器来安装它。
在Visual Studio中,打开你的项目,然后右键点击项目名,选择“管理NuGet包”,然后在搜索框中输入“EasyNetQ”,然后安装它。
2. 创建连接:在你的代码中,你需要创建一个到RabbitMQ服务器的连接。
这可以通过调用``方法来完成。
你需要提供一个连接字符串,该字符串包含连接到RabbitMQ服务器所需的所有信息,如主机名、用户名和密码等。
```csharpvar connectionString ="host=localhost;username=guest;password=guest";var bus = (connectionString);```3. 发送消息:一旦你建立了到RabbitMQ服务器的连接,你就可以使用``方法来发送消息了。
你可以传递一个消息字符串、一个类型或一个消息对象作为`Publish`方法的参数。
```csharp("Hello World message");```4. 接收消息:要接收RabbitMQ服务器发送的消息,你需要创建一个消费者。
EasyNetQ提供了一个`Consume`方法,可以用来创建一个消费者。
你可以传递一个回调函数作为`Consume`方法的参数,该回调函数将在收到消息时被调用。
```csharp(queue => {var message = ();($"Received message: {}");});```5. 关闭连接:当你完成与RabbitMQ服务器的交互后,你应该关闭到服务器的连接以释放资源。
vb.net doevents的用法

一、什么是 DoEvents?在中,DoEvents是一个用于让应用程序处理消息队列中的所有等待消息的方法。
当应用程序在执行复杂运算或者等待外部事件响应时,DoEvents可以让程序在后台处理消息,从而保持界面的响应性。
二、 DoEvents的用法1. 使用DoEvents来处理界面卡顿在编写界面响应性较差的应用程序时,可以通过在复杂运算或者等待外部事件响应的过程中不断调用DoEvents来保持界面的响应。
在一个长时间的循环过程中插入DoEvents方法,可以让界面在处理循环的同时仍然能够响应用户的操作。
2. 避免滥用DoEvents虽然DoEvents可以让界面在复杂运算中保持响应,但是滥用DoEvents也可能导致一些问题。
因为DoEvents会让应用程序在处理消息队列中的所有消息,可能会导致程序处理消息的顺序被打乱,从而引发一些难以调试的bug。
因此在使用DoEvents时,需要谨慎考虑是否真正需要在特定的地方调用该方法。
3. 示例代码下面是一个简单的示例代码,演示了在一个长时间的循环中使用DoEvents来保持界面的响应:```Private Sub LongRunningProcess()For i As Integer = 1 To 0' 一些复杂的运算' ...' 在循环过程中处理消息队列If i Mod 1000 = 0 ThenApplication.DoEvents()End IfNextEnd Sub```以上代码会在每1000次循环时调用DoEvents来处理消息队列,从而保持界面的响应。
三、总结中的DoEvents方法可以在复杂运算或者等待外部事件响应的过程中保持界面的响应,但是需要谨慎使用,避免滥用导致一些潜在的问题。
在实际开发中,可以根据具体的情况来决定是否需要使用DoEvents方法,以达到最佳的用户体验。
四、 DoEvents的适用场景在实际的软件开发中,DoEvents方法可以应用于以下几个场景:1. 在长时间的循环或者计算过程中,可以使用DoEvents来让界面保持响应,同时可以让用户进行其他操作或者取消当前的计算任务。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Net消息队列学习(二)引子 前面的内容已经介绍了关于构建消息发送等有关知识了,接下来,我们就要开始深入到接收消息的这部了。 引子
关于接收问题,涉及到两个问题:
问题1、由于MSMQ并没有规定消息的格式和主体的结构,所以作为接收者应该而且必须知道如何解析消息的主体。只要发送者和接收者都能明白他就行。 问题2、怎样可以监控队列并在消息到来时读取他,这就要求接收者必须采取一个非常有效的队列监控机制。
所以我们在进行构建接受者的时候,就要充分地考虑到这两个问题。接下来,我们就逐一地解决他们。 Net消息队列学习(二)续
消息的自定义类型
这就是我们之前提到的怎样解析消息,前面的例子使用的是一些简单的类型来说明消息队列的结构,然而在发送的数据包含着具体应用程序的数据,其中可以是一个订单,一个收据等。这时你才会发现,消息队列的强大功能。 内置的消息格式化程序可以很容易地把包含有应用程序数据的托管对象解析为消息
.NET消息队列提供了如下的格式程序:XmlMessageFormatter ,BinaryMessageFormatter ,ActiveXMessageFormatter
类型 特性
XmlMessageFormatter 这是默认的格式化程序,前面的例子都是使用它的,从这个名称我们就可以联想到,它是会将自定义的类型串行化为一个XML表示,这个格式化程序很慢,并且会创建相对较多的消息。然而,这些消息可以被运行在不同平台下的应用程序共享和理解。 BinaryMessageFormatter 这个格式化应用程序会把自定义类型串行化为一个专有的二进制的格式。他比上面一种的速度要快得多,而且生成的消息很紧凑。然而只有运行在.NET中的接收者才可以容易地解析这个消息的内容。
ActiveXMessageFormatter ActiveXMessageFormatter 和BinaryMessageFormatter一样,他会把自定义的类型串行化为专用的二进制格式。这个格式也就是MSMQ的COM组件使用的格式。这些传统的COM组件为COM语
言(比如Visual Basic 6)提供了基于MSMQ的功能。因此,您可以在用Visual Basic 6编写的MSMQ应用程序中使用这个格式化程序来发送消息或接收消息。
示例的代码: 1、使用XmlMessageFormatter 下面是发送代码 1private void btnsend_Click(object sender, System.EventArgs e) 2 { 3 4 try 5 { 6 MessageQueue mq=MessageQueue.Create(@".\private$\myPrivate"); 7 8 SudentInfo form=new SudentInfo(this.txtname.Text,this.txtemail.Text,this.txtaddress.Text); 9 System.Messaging.Message msg=new System.Messaging.Message(); 10 msg.Label="A student info"; 11 msg.Body=form; 12 mq.Send(msg); 13 } 14 catch(Exception ex) 15 { 16 MessageBox.Show(ex.Message,"Warning"); 17 } 18 19 20 } 接收代码: private void btnrec_Click(object sender, System.EventArgs e) { MessageQueue mq=new MessageQueue(@".\private$\myPrivate"); Type[] types=new Type[]{typeof(ch2.SudentInfo)}; mq.Formatter=new XmlMessageFormatter(types); System.Messaging.Message msg=mq.Receive(); ch2.SudentInfo form=(ch2.SudentInfo)msg.Body; this.txtsemail.Text=form.Email; this.txtsname.Text=form.Name; this.txtsadd.Text="私有字段,不能串行化"; }
前面我们用的代码,引用了一个自定义的类库,因此只有测试的程序引用了他才能够编译成功。所以我们必须将这个程序集部署到发送者和接收者中。这里似乎就失去了分布式的意义。那么我们应该怎样解决呢? 下面介绍两个方法, 1、我们可以把消息类型指定为字符串数组,在这个数组中的每一个字符串都包含有类型的全名。 2、还可以让用编程的方式判断传入的类型以及构造出正确的XmlMessageFormatter。例如我们使用Message.Label属性来表示包含在消息主体中的数据类型。 方案一、 string[] types=new string[]{"",""}; mq.Formatter=new XmlMessageFormatter(types); 方案二、 //发送者 Message msg=new Message(); msg.Label=typeof(Customer).AssemblyQualifiedName; //接收者 string[] types=new string[]{msg.Label}; msg.Formatter=new XmlMessageFormatter(types); object o=msg.Body;
尽管这个形式相对来说很慢,但是他还是有一些优点的。因为由于消息是简单的XML,所以它可以被任何XML解析器读取和解释。换句话说,应用程序不用XmlMessageFormatter也能反串行化整个消息。
//接收代码 Message msg=mq.Receive(); XmlTextReader xtr=new XmlTextReader (msg.BodyStream); 2、使用BinaryMessageFormatter 示例代码 private void sendByBinary() { try { MessageQueue mq=MessageQueue.Create(@".\private$\myPrivate");
ch2.DeptmentInfo form=new DeptmentInfo(this.txtname.Text,this.txtemail.Text,this.txtaddress.Text); System.Messaging.Message msg=new System.Messaging.Message(); //使用BinaryMessageFormatter这个类型进行串行化,默认情况下,这个属性不进行赋值的话就是XmlMessageFormatter msg.Formatter=new BinaryMessageFormatter();
msg.Label="A student info"; msg.Body=form; mq.Send(msg);
} catch(Exception ex) { MessageBox.Show(ex.Message,"Warning"); } } private void recByBinary() { try { MessageQueue mq=MessageQueue.Create(@".\private$\myPrivate"); //使用BinaryMessageFormatter这个类型进行串行化,默认情况下,这个属性不进行赋值的话就是XmlMessageFormatter msg.Formatter=new BinaryMessageFormatter(); //接收 System.Messaging.Message msg=mq.Receive(); //获取接收的对象 ch2.DeptmentInfo dept=(ch2.DeptmentInfo)msg.Body; //输出 Console.WriteLine(dept.Address); Console.WriteLine(dept.Name);
} catch(Exception ex) { MessageBox.Show(ex.Message,"Warning"); }
} 但要注意的是,和XmlMessageFormatter不同的是,BinaryMessageFormatter使用的是二进制格式来把对象串行化到消息主体中。实际上,他使用了和.Net Remoting一样的运行库串行化机制,这就意味着要使用Serializable特性来修饰类型。同时对比一下,他没有默认的形式那么灵活,尽管速度快,紧凑的多。然而发送者和接收者都必须有一个程序集的副本。 3、使用ActiveXMessageFormatter 他的代码和前面的两个模式一样,在这里就不赘言了。