在.NET平台利用MSMQ实现不同应用间的异步通讯
莫洪艳
【摘 要】[摘要]程序间通信的主要目的是实现一台或多台计算机中应用程序之间的数据共享与信息交换。利用MSMQ实现不同应用间通讯适用于不要求消息接收方实时反馈应答、低耦合、松散型的应用之间的通讯。本文结合天铁热轧轧线MES中MSMQ的应用,介绍了.Net平台下如何利用MSMQ实现不同应用间的异步通讯。 【期刊名称】天津冶金 【年(卷),期】2017(000)006 【总页数】3
【关键词】[关键词]MSMQ;异步通讯;MES
1 前言
MicroSoft Message Queuing(微软消息队列)官方给出的定义是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。在理解消息队列消息传递机制中,有两个比较重要的概念,消息和队列。举个例子说,消息就如同一个写了收信人、寄信人等信息的电子邮件,邮件内容可以是文字、视频、声音等各种媒体,但这个内容需要收发双方事前约定好方式如何解码。然而,不同于电子邮件的“送信上门”服务,这些消息被存放在公用空间消息队列中,然后由消息的接收方也就是接收程序自己取出来并处理,接收方可以存在本地计算机也可以工作在能访问该消息队列的网络中的任何计算机上。
2 采用MSMQ的好处
采用消息队列最大的优点就是良好的可靠性和故障恢复能力。在系统实际运行过程中,难免会发生状况导致作为通讯接收方“失联”,采用MSMQ的异步通讯的发送方仍然可以正常进行消息发送,不必担心对方是否正常启动了、是否发生了故障,不必一直等待对方反馈,只要发送端进行正常的消息发送就认为处理完成了,当网络恢复或接收方故障解除后再自行读取消息就行了。之所以能够做到这一点是因为MSMQ可以存于内存中也可以存于物理文件中,前者注重消息传递的速度,后者注重消息的可恢复性。同时,为了更可靠的传递消息,还可以将消息队列单独存放在一台服务器中,既不在通讯的发送方,也不在接收方。可见,消息队列这一特点使得它不适合消息发送接收双方需要实时交互的情况,因为存在大量请求的时候,响应可能会延迟。
MSMQ可以设置优先级,可以为关键的应用程序保证足够的响应时间。另外,可以将多个相关消息作为一个事务处理,当发生错误时取消整个事务,保证业务完整。
最后作为开发者,采用MSMQ开发很方便,在微软的.net平台上利用其提供的MSMQ功能,可以轻松创建、删除消息队列,实现消息的发送或者接收,同时也可以对消息队列进行管理。
3 天铁热轧轧线MES中各应用之间关系
天铁热轧轧线MES后台运行着多个应用程序,每个应用程序都是独立封装在一起的功能集合,应用之间信息传递不需要实时交互。通讯程序作为其中一部分负责与多个外部系统进行通讯,包括轧线生产主要工序的各个二级系统、板坯库管理系统、钢卷库管理系统等等,通讯程序将根据接收到的电文创建消息发送到消息队列OUT_TO_SVC中,并将SVC_TO_OUT消息队列中的消息发送到
外部系统。消息分发程序TRANMQ.exe负责将消息队列OUT_TO_SVC内的消息根据每个消息的类型以及目标处理程序分别发送到指定的消息队列。比如说消息队列Trn_out_to_S存储钢卷库系统发送来的消息,然后由钢卷库消息处理程序DES.exe取出并处理。每个业务程序都循环扫描对应消息队列中的新内容,发现新消息取出并根据业务需要进行相应处理,同时也会产生新的消息向其他应用传递,同样只需要将消息放到约定好的消息队列中就可以了,其他应用程序或通讯程序自行读取,无须担心。例如图一所示,作为控制中心程序的PCCSVC.exe,在处理业务过程中只需将消息放到消息队列SVC_TO_RPT和SVC_TO_OUT,就可以认为成功传递给报表系统程序和通讯程序了。可以看出每个应用程序在消息传递过程中充当的角色根据需要既可以是消息的发送方也可以是接收方。
4 MSMQ的安装和管理
天铁热轧MES系统应用在Windows Server2003操作系统下,系统默认安装时不安装消息队列组件,想使用消息队列进行通信的话,就必须在电脑上安装消息队列组件。在系统“添加删除组件”中,找到“应用程序服务器”里面的“消息队列”选中确定,如需要重启根据系统提示进行操作就可以了。打开“控制面板”中的“计算机管理”,展开“服务和应用程序”,如果安装成功可以找到“消息队列”,如果找不到说明消息队列还没有安装成功。
在图2中可以看到传出队列、专用队列和系统队列,其实还有一种公用队列图片中没有显示,那是因为公用队列只在域环境下创建,图片中机器工作在工作组中,因此看不到公用队列,同样程序开发时也不能创建公共队列。天铁热轧轧线MES开发程序过程中用到最多的是专用队列。使用管理工具可以轻松的创