MSMQ和.Net Remoting在MES开发中的应用

合集下载

MSMQ

MSMQ

.NET编程 编程
5、发送消息: MessageQueue mq = new MessageQueue(@".\Private$\LeeMSMQ"); mq.Send("sayhello1,hello msmq!", "sayhello1"); mq.Send("sayhello2,hello msmq!", "sayhello2"); 6、接受并删除消息: MessageQueue mq = new MessageQueue(@".\Private$\LeeMSMQ") Message msg = mq.Receive();//引用的队列中可用的第一条消息 7、接受但不删除消息: Message msg = mq.Peek(); 8、删除所有消息: Message msg = mq.Purge();
.NET编程 编程
1、命名空间 using System.Messaging; 2、默认存储路径 C:\WINDOWS\system32\msmq\storage 3、创建消息队列: MessageQueue mq = MessageQueue.Create(@".\Private$\LeeMSMQ"); 4、删除队列: MessageQueue.Delete(@".\Private$\LeeMSMQ");
优点
稳定、消息优先级、脱机能力以及安全性, 有保障的消息传递和执行许多业务处理的可 靠的防故障机制。 (1)移动短消息处理 (2)网络聊天工具
安装MSMQ 安装
队列的类型 队列
• “公共队列”在整个“消息队列”网络中复制,并 且有可能由网络连接的所有站点访问。 • “专用队列”不在整个网络中发布。相反,它们仅 在所驻留的本地计算机上可用。专用队列只能由知 道队列的完整路径名或标签的应用程序访问。 • “管理队列”包含确认在给定“消息队列”网络中 发送的消息回执的消息。指定希望 MessageQueue 组件使用的管理队列(如果有的话)。 • “响应队列”包含目标应用程序接收到消息时返回 给发送应用程序的响应消息。

NET Remoting过时了吗为什么公司的项目还是选择用NET Remoting,而不是WCF

NET Remoting过时了吗为什么公司的项目还是选择用NET Remoting,而不是WCF

近两年看到很多介绍WCF分布式开发的文章,很少看到有深入介绍.NET Remoting开发的文章,似乎Remoting技术逐渐从大众的视野中消失了一样。

自从2005年发布这个名称为Indigo的技术以来,WCF逐渐成为.NET分布式开发的事实标准。

然后微软没有推崇和更新的技术,像我们这样的第三世界国家,唯微软马首是瞻,也纷纷转向WCF技术的实践与开发。

近期看到世界对SilverLight技术前展的担忧,就看到很明显的倾向。

一个以擅长开发平台(Platform,.NET)和开发工具(Visual Studio,SQL Sever)的公司,居然也能控制大量的中下游开发商的技术选择倾向,一想到最近在做的工作流WF的升级(.NET 3.0到.NET 4.0)的尴尬处境,令人叹息不已,这也许是IT产业链的特色。

我要提出的的观点是,作为通讯技术架构的.NET Remoting,并没有从我们的视野中消失,反而有很多产品还是继续使用和维护以.NET Remoting作为通讯架构方式。

我所看到的产品,是上市公司的产品,年收入是百万级别的产品,不用怀疑它是小企业的小应用。

所以,我要讨论一下,为什么.NET Remoting没有过时,更没有out。

先来看一下,要能成为企业应用的通讯架构技术基础,要满足的条件∙被传送的对象,消息(.NET Message)要容易定义,格式通用,灵活∙传递消息的方式,通常叫Channel, 灵活,支持各种应用环境,比如局域网选择TCP,互联网选择HTTP,进程间的通讯可选择Named Pipes或MSMQ。

∙被使用的服务(Services)要容易定义,并且可以灵活选择通道和消息格式抽象的说了这几点,不容易理解,来举例说明。

在ERP系统中,是如何做到简单灵活的应用通讯技术的。

以销售系统为例子,来看看它的架构方式。

消息格式定义销售单[Serializable]public partial class SalesOrderEntity : CommonEntityBase{public virtual System.String PriceCode{get { return (System.String)GetValue((int)SalesOrderFieldIndex.PriceCode, true); }set { SetValue((int)SalesOrderFieldIndex.PriceCode, value); }}public virtual System.String VendorNo{get { return (System.String)GetValue((int)SalesOrderFieldIndex.VendorNo, true); }set { SetValue((int)SalesOrderFieldIndex.VendorNo, value); }}}销售单只举例了两个属性,卖价编码和供应商商编码,在定义实体时,加Serializable特性表示可以序列化传递。

MSMQ入门

MSMQ入门

中进行消息处理(MSMQ)一MSMQ 是微软消息队列的英文缩写。

那么什么是消息队列?这些介绍网上一大片这里就不多说了。

本文对 于大虾级的人物来说这只是小玩意而已,对于初学者来说这文章还是有一定的帮助,希望路过的大虾们别 笑话我班门弄斧。

一、MSMQ 介绍和安装消息队列 使用消息队列的优点:稳定、消息优先级、脱机能力以及安全性。

消息队列分为用户创建的队列(专用队列)和系统队列,用户队列分为,。

我是 Windows XP,看下图所 示(myQueue 为自己创建的消息队列,msmqtriggersnotifiations 为通用队列):对消息队列有了简单的了解后,使用 MSMQ 进行软件开发需要安装 MSMQ,安装完后就该进入实际 的开发阶段。

具体的安装过程就是在控制面板里“添加/删除程序”下“添加/删除 Windows 组件”,完成添加就 OK。

安装完成后就可以通过交互界添加新的消息队列,详细如下图:出了上面这种交互界面来创建 MSMQ 外,也可以通过编程来完成,.NET 框架里的 MessageQueue 类下有一静态方法 Create,用来完成消息队列的创建,其定义如下:1// 2// 摘要: 3// 在指定的路径中创建非事务性“消息队列”队列。

4// 5// 参数: 6// path: 7// 要创建的队列的路径。

8// 9// 返回结果: 10// 表示新队列的 System.Messaging.MessageQueue。

11public static MessageQueue Create(string path); 12// 13// 摘要: 14// 在指定的路径中创建事务性或非事务性“消息队列”队列。

15// 16// 参数: 17// transactional: 18// 如果创建事务性队列,为 true;如果创建非事务性队列,则为 false。

19// 20// path: 21// 要创建的队列的路径。

.Net Remoting(基本操作) - Part.2

.Net Remoting(基本操作) - Part.2

// 注册 tcp 通道 ChannelServices.RegisterChannel(tcpChnl, false);
// 注册 http 通道 IChannel httpChnl = new HttpChannel(8502); ChannelServices.RegisterChannel(httpChnl, false); } } }
1.客户端(客户应用程序)
客户端的处理包含三个基本的组成部分,代理(Proxy)、格式器(Formatter) 和 通道(Channel)。 客户端总是通过一个代理来和服务端对象进行交互。客户端向代理请求属性或者方法调用,然后代理将请求发送给服务端的对象。每一个代 理绑定一个远程对象,多个代理也可以绑定同一个对象(Singleton 方式,后面会介绍);客户端的多个对象也可以使用同一个代理。代理分为两 部分,一个名为透明代理(Transparent Proxy),一个名为真实代理(Real Proxy)。透明代理提供了和服务对象完全一致的公共接口,当客户进行 方法调用时,透明代理将栈帧(Stack Frame,在栈中为参数、返回地址和局部变量保留的一块内存区,必要时在过程调用中使用)转换为消息 (Message),然后将消息发送给真实代理。这个消息对象包含了调用的对象的方法信息,包括方法签名、参数等,同时还包括客户端的位置(注意 这里,方法回调(Callback)时会再提到)。真实代理知道如何连接远程对象并将消息发送给它。 真实代理收到消息后,请求 Formatter 对象对其进行序列化,同时将客户程序中断(block)。.Net 内置了两种序列化格式,一种是二进制 Binary,一种是 SOAP。Formatter 将消息进行序列化之后,然后将其发送到通道中,由通道将消息发送到远程对象。当请求返回时,Formatter 将返回的消息反序列化,然后再提交给代理,代理将返回值放到发送请求的客户对象的调用堆栈上,随后将控制返回给客户调用程序(解除中断)。 这样就给了客户对象一个错觉:代理即为远程对象。

NET Remoting Server 性能分析及利用Loadrunner进行性能测试的方

NET Remoting Server 性能分析及利用Loadrunner进行性能测试的方

NET Remoting Server 性能分析及利用Loadrunner进行性能测试的方.NET Remoting Server 性能分析及利用Loadrunner进行性能测试的方案1概述.NET Remoting 被誉为管理应用程序域之间的 RPC 的首选技术。

应用程序域是公共语言运行库的隔离单元,它们是在进程内创建并运行的。

这与 CLR 和非 CLR 托管的进程之间的进程间通信(互操作)不同。

后一种类型的 RPC 通信(特别是 Web 上的)一般被认为是 Web 服务领域的问题。

遗憾的是,这种看似清楚的区分,却由于可以在 IIS 下集成 .Net Remoting 服务器而变得模糊,“通过在 IIS 中集成 .NET Remoting 对象,可以将其作为一种 |>,jOnGfWeb 服务提供……” -e=;X!oe{b !=F.|Q9kRemoting,简而言之,我们可以将其看作是一种分布式处理方式。

从微软的产品角度来看,可以说Remoting就是DCOM的一种升级,它改善了很多功能,并极好的融合到.Net平台下。

Microsoft? .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。

这也正是我们使用Remoting的原因。

为什么呢?在Windows操作系统中,是将应用程序分离为单独的进程。

这个进程形成了应用程序代码和数据周围的一道边界。

如果不采用进程间通信(RPC)机制,则在一个进程中执行的代码就不能访问另一进程。

这是一种操作系统对应用程序的保护机制。

然而在某些情况下,我们需要跨过应用程序域,与另外的应用程序域进行通信,即穿越边界。

其主机与客户端的主要任务如下:L\ ip'af\\JJ ,Mi,dyZ5主机任务=・设计服务,选择应用程序域、激活模式、通道、端口和发布。

・实现Remoting 主机应用程序域(例如 IIS/系统服务)。

・配置主机激活、通道和协议设置。

上位机与MES信息对接的常用方式有哪些

上位机与MES信息对接的常用方式有哪些

上位机与MES信息对接的常用方式有哪些-Begin-前言在实际应用过程中,经常有学员问道:(上位机)怎么与MES进行信息交互?今天跟大家介绍一下,上位机与MES对接的几种常用的方式。

数据库数据库是任何一个开发人员都必须掌握的技能,因此,对于一些简单的交互,通过数据库应该是双方都能够接受的,这里要注意,尽量避免操作生产数据表,可以根据实际业务场景,通过新增一个专门用于交互的数据表,来减少操作失误。

文件有的时候,上位机也可以通过文件来与MES交互,可以是各种格式的文件,文本文件、excel、xml都可以。

比如,上位机或MES 定时生成文本文件,对方(检测)文件的生成时间,来判断是否流程完成,进而实现后续流程。

传输层TCP这里的TCP指的是传输层TCP,双方约定好协议内容,通过Socket 连接,发送和接收,来实现数据(通信)。

应用层TCP应用层TCP包括一些确定的应用层协议,比如ModbusTCP、MQTT、OPCUA等。

KepServer有一些厂家的开发人员,为了方便,会使用KepServer来做数据交互,KepServer本身不仅可以走OPC,还支持数据库或(Iot)Gateway 插件等一些方式。

WebServiceWebService是一个SOA(面向服务的(编程))的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言(通过xml 描述)间的相互调用,通过Internet进行基于Http协议的(网络)应用间的交互。

通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。

WebA(pi)WebApi是一个简单的构建HTTP服务的新框架。

在.Net平台上WebApi是一个开源的、理想的、构建REST-ful服务的技术,可以部署在应用程序和IIS上。

当然,我们也可以通过Http协议来实现对接,毕竟WebApi的本质就是Http协议。

WCFWCF也是基于SOAP的,数据格式是XML,WCF是Web Service (ASMX)的进化版,可以支持各种各样的协议,像TCP,HTTP,HTTPS,Named Pipes, MSMQ。

用Net Remoting访问远程对象

用.Net Remoting访问远程对象Net提供了好几种通信协议与方式使得这种开发变得简单而快速,你甚至无需知道太多的传输协议与编码细节。

因此,无论你开发一个web应用还是关键的、涉及多操作系统和多通信协议的企业级应用,.Net都将对你提供全面的支持。

跨进程的对象通信技术一直是个复杂的工作,现在这些复杂的处理工作都交给.Net framework来完成了。

.Net Remoting能使客户端应用调用位于本机或者网络上其他进程中的对象,你也可以利用.Net Remoting调用同一个进程中不同应用域中的对象。

.Net Remoting提供了一种可以把远程对象的通信机制从特定服务器和客户端中分离出来的抽象方法,因此,它是灵活的、方便的,并且是易于定制的。

你可以更换通信协议和交换格式,而无需重新编译客户端和服务器端应用。

另外,这个远程机制并不针对任何特定的应用模式,你可以从一个web application、一个主控台应用、一个windows service---------甚至是任何你需要的系统发起调用。

远程服务器也可以是任何类型的可执行系统,任何应用都可以宿主/容纳(作为一个对象容器)一个远程对象并且对任何客户端提供该远程对象的服务。

选择.Net调用协议.Net Framework提供了好几种面对不同应用域的对象调用方法,每一种方式都有其独特的技术与弹性。

比如,Internet的快速成长使得XML/Web Service成为一种极富诱惑力的通信手段,因为Web Service建立在Http协议和以XML作为交换格式的Soap协议之上,而这一基础架构普遍存在。

它们已经是公共标准,可以在web架构中随时使用,而不用担心访问代理和防火墙的问题。

但是,并非所有的应用都应该使用Web Service,基于Http连接的Soap数据流传输(serialization)存在严重的效率问题。

这里我们将探讨那一种对象互操作协议适合于你的应用。

MSMQ_Doc

MSMQ简介消息:在凉台计算机间传送的数据单位。

消息可以是文本字符串,也可以是复杂的对象。

消息队列:在消息的传输过程中保存消息的容器(先进先出)。

MSMQ是Microsoft的消息处理技术,它在任何安装了Microsoft Windows的计算机组合中,都可以使用。

消息队列类型1)用户队列(可以修改的队列)-公共队列(MachineName\QueueName)在整个消息队列网络中复制,能被别的机器所访问,如果你的多个项目中用到消息队列,那么你可以把队列定义为公共队列。

-专用队列(MachineName\Private$\QueueName)不在整个消息队列网络中复制,只针对于本机的程序才可以调用的队列,有些情况下为了安全起见定义为私有队列。

-管理队列包含确认在给定消息队列网络中发送的消息回执的消息。

-响应队列包含目标应用程序接收到消息时返回给发送程序的响应消息。

2)系统队列-日志队列(MachineName\QueueName\Journal$ 系统会记录所有消息的副本)-死信队列(发布出去的队列)-报告队列-专用系统队列MSMQ的优点高效稳定高效:MSMQ是异步通信,无论是发送方还是接收方都不用等待对方返回成功消息,因而大大地提高了事物处理的能力。

稳定:消息存储在队列中并一直留在那里,直到被适当的处理;可恢复模式在传送过程的每一步骤中,都把消息写入物理磁盘中,以得到较好的故障恢复能力。

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

脱机能力MSMQ与WebServices和.NetRomting一样是一种分布式的开发技术。

但是MSMQ则可以在Server端离线的情况下工作。

(将消息临时保存在Client端的消息队列中,以后联机再发送到Server端处理;而WebService和Remoting就必须建立在Server端联机并且正常工作的前提之下。

MSMQ浅析

msmqmsmq消息队列浅析消息队列浅析gaoleigaolei消息队列介绍消息队列介绍为什么要用消息队列为什么要用消息队列消息队列的安装消息队列的安装消息队列的路径声明消息队列的路径声明消息队列的消息封装消息队列的消息封装消息队列的发送消息队列的发送消息队列的接收消息队列的接收autosenseautosense的应用的应用消息队列介绍消息队列介绍消息队列消息队列msmqmsmqmicrosoftmessagemicrosoftmessagequeuequeue是运行在是运行在windowswindows操作系统上的一个操作系统上的一个服务服务它提供了运用程序之间的异步消息处理

消息队列的安装
消息队列属于Windows组件可以在,组件 消息队列属于Windows组件可以在,组件 安装中找到并快速安装。
消息队列的路径声明
<!—Autosense MSMQ的地址--> <!— MSMQ的地址 > 的地址-<add key="MsmqPath" value="FormatName:DIRECT=OS:ceshi3\ value="FormatName:DIRECT=OS:ceshi3\pri vate$\ vate$\AutoSenseMsmq"/>
消息队列的消息封装
消息队列在.Net框架中得到了很好的支持,开发简便 消息队列在.Net框架中得到了很好的支持,开发简便。它 开发简便。它 使用的命名空间是System.Messaging。 使用的命名空间是System.Messaging。需要项目引用 DLL。 DLL。 消息队列经过序列化 消息队列经过序列化将消息发送出去,这一过程由系统自 序列化将消息发送出去,这一过程由系统自 动完成了,程序开发人员不必为此编写代码,然而在接收 到消息后就面临着消息序列化的问题。 消息的序列化可以通过.Net附带的三个预定义的格式化程 消息的序列化可以通过.Net附带的三个预定义的格式化程 序来完成:XMLMessageFormatter 序来完成:XMLMessageFormatter 对象 ( MessageQueue 组件的默认格式化程序设置)、 BinaryMessageFormatter 对象、 ActiveXMessageFormatter 对象。

企业级开发基础之MSMQ

企业级开发基础之MSMQ企业级开发基础之MSMQ基础概念:消息:两台计算机之间的传送数据的基本单位。

消息队列:消息传输过程中保存消息的容器。

消息队列网络:能够相互间来回发送消息的一组计算机。

消息被发送到队列中。

“消息队列”是在消息的传输过程中保存消息的容器。

消息队列管理器在将消息从它的源中继到它的目标时充当中间人。

队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。

队列类型队列一般分为两大类,一种是用户创建的队列,一种是系统队列。

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

专用队列:不在整个网络中发布。

相反,它们仅在所驻留的本地计算机上可用。

专用队列只能由知道队列的完整路径名或标签的应用程序访问。

管理队列:包含确认在给定“消息队列”网络中发送的消息回执的消息。

指定希望MessageQueue 组件使用的管理队列(如果有的话)。

响应队列:包含目标应用程序接收到消息时返回给发送应用程序的响应消息。

指定希望MessageQueue 组件使用的响应队列(如果有的话)。

系统生成的队列:日记队列:可选地存储发送消息的副本和从队列中移除的消息副本。

每个“消息队列”客户端上的单个日记队列存储从该计算机发送的消息副本。

在服务器上为每个队列创建了一个单独的日记队列。

此日记跟踪从该队列中移除的消息。

死信队列:存储无法传递或已过期的消息的副本。

报告队列:包含指示消息到达目标所经过的路由的消息,还可以包含测试消息。

每台计算机上只能有一个报告队列。

专用系统队列:是一系列存储系统执行消息处理操作所需的管理和通知消息的专用队列。

创建和使用队列首先我们需要先去安装MSMQ的环境,MSMQ的安装就跟安装IIS的步骤差不多,这里就不去举例了。

.net中提供了方便我们操作MSMQ的组件—System.Messaging。

创建和使用队列消息的可以通过MessageQueue去实现,其中里面有几个重要的方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MSMQ和.Net Remoting在MES开发中的应用 发表时间:2009-5-9 李歆 史海波 潘福成 高明山 在.Net平台下,基于MSMQ和.Net Remoting构建MES系统中生产事件消息通信机制,利用MSMQ实现生产事件的消息传递,利用.Net Remoting实现生产事件的订阅,有效解决了以往开发应用中遇到的问题,提高了系统的可靠性和灵活性。 1 引 言

MES(制造执行系统)是近10年来在国际上迅速发展、面向车间层的生产管理技术与实时信息系统,是用来辅助生产管理人员收集现场资料并控制现场制造流程的应用软件,是企业改善制造流程、提高生产效益的工具。在其开发应用中,基于各类生产事件的消息通信机制是系统的莺要功能之一。保证消息通信的可靠性、稳定性并控制网络通信开销是MES消息通信机制开发的重点。在以往的开发应用中,现场各生产工位HMI利用Socket向MES服务器发送生产消息,服务器收到消息后作消息解析并生成生产事件,生产事件客户端采用轮询的方式获得相关生产事件并做出响应。其中,存在如下问题:

(1)当网络发生故障时,Socket无法保证生产事件消息的送达,导致生产消息丢失; (2)当生产事件频发时,MES服务器处理负担增加,系统性能下降; (3)采用轮询方式。降低系统性能并增加网络通信开销。

2 系统解决方案分析 利用微软消息队列MSMQ和.Net Remoting技术,能够有效避免上述问题,为构建MES生产事件消息通信机制提供良好的解决方案。

2.1 利用MSMQ实现生产消息传递 MSMQ(Microsoft Message Queue,微软消息队列)是一种利用队列机制实现应用程序问通信的技术,允许应用程序以异步的、非实时的方式互相传递信息。

利用MSMQ来传递MES生产事件消息,借助MSMQ的“离线”发送消息的特性(客户端可以在与服务器无法建立连接的情况下即时发送消息,未送达的消息暂存于客户端的消息队列中,待连接成功建立后立即发送,而且保证消息只发送一次),可以有效避免消息的丢失和重传;同时,MSMQ的异步通信特性为服务器提供了良好的消息缓冲机制,有效降低了消息高峰时服务器端的负载。

2.2 利用.Net Remoting实现生产消息订阅 .Net Remoting是一种分布式对象技术,是在.NET框架中执行进程问通信的方式,它允许运行在另一机器上的应用程序、进程或者对象访问某机器上运行的对象,让远程对象看上去像本地的一样。

在.Net Remotin只中使用事件,能方便实规远程事件回调机制,让服务器在接收到某个“消息”时,主动调用某个或多个客户端的响应方法。利用该技术,可以实现MES中事件客户端灵活订阅服务器生产事件的功能,解决轮询方式造成的系统负担,提高系统的灵活性。

3 系统设计与实现 3.1 系统设计 将MSMQ和.Net Remoting引入MES生产事件消息通信机制,利用MSMQ实现生产事件消息的传递,利用.Net Rerooting实现生产事件的订阅。其中,MSMQ触发器实现生产事件消息的触发,.Net Remoting的事件回调作为触发器的调用对象,以COM组件的形式定义封装。系统的结构,如图1所示:

图1 MES生产事件消息通信结构示意图 3.2 系统实现

3.2.1 MSMQ消息传递实现要点 MSMQ消息传递的实现过程主要包括:MSMQ组件安装与配置、消息队列建立、消息类定义、用于触发的COM组件定义、消息队列触发器建立和消息发送代码编写。以下,对其中的要点加以说明:

(1)消息队列类型及引用 服务器端定义的生产消息队列中,用于远程通信的队列,定义为公有类型;用于本地通信的队列,定义为私有类型。在引用方式上,有三种方法可以在代码中引用一个队列:通过路径、通过格式名、通过标签。两类不同消息队列采用不同的引用方式。

·公有队列:采用格式名方式,通过消息队列GUID引用,引用格式为MQPath=FORMATNAME:Public=QueueGUID,如String MQPath=“FORMATNAME:Public=DOC7684-E289-4E99-A81A-FB6FA D3CDD18”;

·私有队列:采用路径方式.引用格式为MQPath=.\Private$\QueueName,如String MQPath=“.\Private$kAlarmEventQueue”。

(2)消息类定义 消息队列中传递的消息内容需要按生产事件类型进行封装,因此需要定义消息类,分别部署在客户端和服务端,用于发送封装和接收解析。按照生产事件的分类,分别定义四类消息类:报警事件消息类、生产事件消息类、计划事件消息类和停机事件消息类。其中报警事件消息类定义如图2所示:

图2 报警事件消息类定义可恢复属性配置 (3)消息发送 向消息队列发送消息分为:建立消息队列引用、建立消息对象和消息发送三个步骤。以报警事件发送为例,代码如下:

//建立消息队列引用 string QueueLoeation=@“.\PrivateSLAlarmEventQueue”; if(System.Messaging.MessageQueue.Exists(QueueLocation)) queue=new System.Messaging.MessageQueue(QueueLocation); else queue=System.Messaging.MessageQueue.Create(QueueLocation); //建立消息对象 System.Messaging.Message msg=new System.Messaging.Message(); msg.Body=msgAlarmEvent;//指明消息体 msg.Recoverable=true;//设置町恢复属性 //消息发送 queue.Send(msg);

(4)消息接收 从消息队列接收消息分为:建立消息队列引用、消息接收和消息解析(反序列化)三个步骤。此部分代码位于用于消息队列触发的COM组件定义中,以报警事件为例,代码如下:

//建立消息队列引用 System.Messaging.MessageQueue queue=new MessageQueue(@“.\Private$\AlarmEventQueue”); //消息接收,Peek方法使消息不从队列中删除 System.Messaging.Message msg=queue.Peek(); //消息解析,采用默认方式XmlMessageFormatter反序列化消息 msg.Formatter=new XmlMessageFormatter(new Type({type of(MsgAlarmEvent)}); MsgAlarmEvent MannEvent=(MsgAlarmEvent)msg.Body; 3.2.2 .Net Remoting事件订阅实现要点

.Net Rerooting事件订阅实现过程主要包括:事件委托定义、远程事件类定义、远程事件对象发布(封装成Windows服务)、订阅事件回调(包含在消息队列触发的COM组件中)和客户端接口封装。以下对其中的要点加以说明:

(1)事件委托定义 按照生产事件的分类,分别定义四类不同的委托,以报警事件为例: public delegate void NotifyAlarmEventHandler(int alarmid,DateTime timestamp,int causeid,string alarmdesc);

(2)远程事件类定义 远程事件类的实例需要以引用的方式传递,因此该类需要继承MarshalByRefObject类(通过使用代理交换消息来跨越应用程序域边界进行通信的对象的基类)。同时复写MarshalByRefObjeet类的InitializeLifetimeService()方法,让其返回空以保证远程对象永远不会过期。类成员包括相应类型的事件委托和触发事件回调的方法。

(3)One Way属性和事件委托链 在远程对象中定义的触发事件回调的方法必须标记为“[OneWay]”,指明该方法为单向方法。否则,由于.Net Remoting是按照事件订阅的顺序来回调客户端方法的,服务器将一直等待当前回调返回才能触发下一个回调,这便影响了客户端对事件的响应速度,尤其当某砦客户端回调方法占用大量时间或执行发生异常时。另外,使用遍历事件委托链的方式来触发回调,可以处理客户端无法接收的错误,增强系统的健壮性。以报警远程事件类为例,其触发事件方法代码如下:

[OneWay] public void SendEvent(int alarmid,DateTime timestamp,int eauseid,string alarmdesc){ if(NotifyEvent!=null){ Notif,rAlarmEventHandler tempEvent=null; foreach(Delegate del in NotifyEvent.GetlnvocationList()){ try{tempEvent=(Notff)rAlarmEventHandler)del; tempEvent(alarmid,timestamp,causeid,alarmdesc); }catch{//处理客户端无法接收错误} } }else{//处理没有客户端订阅错误} }

(4)客户端接口封装 客户端接口封装需要为客户端提供远程对象获取接口、事件订阅接口、事件取消订阅接口和客户端回调

相关文档
最新文档