文 姜大博
本文深入浅出,介绍吉林电视台高清频道的消息服务器是如何工作,又如何去解决消息服务的相关问题。
消息服务可以让播出系统各个软件之间实现互相联系,合作,从而保证各软件相互独立而又紧密通信。消息队列是用来实现播出软件不同模块之间进行通信的,它使用结构可以简单划分为消息发送端、服务器端、消息订阅端。
消息队列的工作流程是这样的:首先在所有的模块启动时都会向消息服务器端进行消息订阅,告诉服务器需要订阅那种类型的消息,之后如果某个模块需要向其他模块发消息,这个模块就会将消息发送到服务器端,服务器端会根据各个模块订阅消息的类型将这个消息转发给相应模块的本地消息队列中去,之后订阅端的模块就会从本地的队列中获取这个消息并进行相应处理。
此流程中,编单软件先将消息发送到消息服务器的消息队列中,消息服务器检测到队列中有了新的消息,可以根据消息订阅情况得知出负责播出工作的几台机器订阅了这个消息,之后把这个消息转发过去,这样负责播出工作的几台机器就可以在本地消息队列中读取编单软件发出的这条消息,从而进行完成了两种软件之间的快速、完美通信,以便进行下一步任务。
此流程中,播出软件先将消息发送到消息服务器的消息队列中,消息服务器检测到队列中有了新消息,会根据消息订阅情况判断出上载工作站订阅了这个消息,之后把这个消息转发到上载工作站的机器上,这样负责上载工作的几台机器就可以在本地消息队列中读取播出软件发出的这条消息,以便进行下一步任务。
此流程中,播出软件先将消息发送到消息服务器的消息队列中,消息服务器检测到队列中有了新消息,会根据消息订阅情况判断出上载工作站订阅了这个消息,之后把这个消息转发到上载工作站的机器上,这样负责上载工作的几台机器就可以在本地消息队列中读取播出软件发出的这条消息,以便进行下一步任务。
在素材管理器中添加素材同步的相关任务,或者选择重新执行某个失败的素材管理任务后,素材同步服务器可以立即获取并执行相关任务。此流程中,素材管理器先将消息发送到消息服务器的消息队列中,消息服务器检测到队列中有了新消息,会根据消息订阅情况判断素材同步服务器订阅了这个消息,之后把这个消息转发过去。
此流程中,素材管理器先将消息发送到消息服务器的消息队列中,消息服务器检测到队列中有了新消息,会根据消息订阅情况判断素材同步服务器订阅了这个消息,之后把这个消息转发过去。
此流程中,素材管理器先将消息发送到消息服务器的消息队列中,消息服务器检测到队列中有了新消息,会根据消息订阅情况判播出软件订阅了这个消息,之后把这个消息转发过去。
此流程中,同步服务器先将消息发送到消息服务器的消息队列中,消息服务器检测到队列中有了新消息,会根据消息订阅情况判断各个素材管理器订阅了这个消息,之后把这个消息转发过去。
如果消息服务器正常工作,上述环境下消息队列没有起到相应作用,可以通过下列方法判断问题所在。(1)确认发送端和接收端使用的本地消息队列是否存在,是否可以正常访问。(2)退出消息服务器软件和接收端应用程序。(3)在发送端软件执行一个可以发送消息的动作,然后到服务器端消息队列中查看消息是否发送过去,如果可以看到此条消息,说明消息发送端工作正常;否则,可能是消息发送端软件问题,它并没有向服务器端发送消息;是系统配置错误没有指定正确的消息服务器地址;发送端和服务器端的网络通讯存在问题;服务器端消息队列有问题,无法接受消息。对于后两种情况可以换一个消息发送端以判断和排除。(4)如果服务器端队列中已经正常收到了消息,可以启动消息服务器软件,然后去接收端的消息队列中查看消息是否被转发到本的队列,如果可以正常转发说明消息服务器和订阅信息都是正确的。否则可能是接收端没有在服务器端正确订阅消息造成的;或者是接收端消息队列不正常造成的。(5)如果消息已经被转发到了接收端的队列中,启动接收端的软件,观察是否可以正确处理接收到的信息,如果没有正确处理,说明接收端的软件在处理消息队列是存在问题。
如果使用安装程序时选择消息服务器安装,则安装结束后在安装目录下会生成一个MSMQ目录,这个目录就是消息服务器程序所在目录。安装程序会将消息服务器设置为开机自动启动,如果需要手动启动消息服务器,需要在消息服务器下找到消息服务器程序DBSMQSvrU.exe,为该程序创建一个快捷方式,在快捷方式中加上“-debug”的参数,以后直接运行就可以启动东消息服务器程序。消息服务器启动后在操作系统的任务管理器中的进程窗口中,可以看到名为”DBSMQSvrU.exe”的线程,表示消息服务器正在运行。
那么下面来谈一下如何查看消息服务器的消息订阅情况。在消息服务器软件运行的机器C盘根目录,有一个SubScribe.txt文本文件,里面记录了消息服务器收到的所有消息订阅信息。文本中包含多行文字内容,每一行都表示一个消息订阅。每行的格式如下:dy bc#clipMgrMsg#dybc#ClipMgrSys#MSG_CLIPMGRSVR表示:dybc这台机器clipMgrMsg和ClipMgrSys这两个消息队列想消息服务器定于了消息,CLIPMGRSVR表示订阅的消息类型。如此,当消息服务器接收到CLIPMGRSVR这个类型的消息时,就会向名称为dybc这个机器的clipMgrMsg和ClipMgrSys这两个消息队列发送消息。这两个队列第一个是消息队列第二个是系统队列,我们需要查看的都是具体的消息内容,所以只要查看第一个队列汇总的内容就可以了。如果出现了消息服务器不能将消息转发给指定客户端队列的情况,就可以在SubScribe.txt中先查询消息服务器是否正确接收了客户端的订阅。如果没有,需要在消息服务器已经启动的情况下重新启动客户端程序进行订阅,如果已经顶跃上了,并且消息已经传送到了消息服务器的消息队列中,就说明消息服务器服务产生了异常,可以重启消息服务器软件进行观察。
那么如何查看各个模块使用的消息队列名称?基本上每一个软件按模块都要使用消息队列(包括系统队列和消息队列),我们要知道每个模块使用的消息队列的名称才可以在消息队列出现问题的时候进行测试和查看。要想确认每个模块使用的消息队列名称,可以使用以下方法:在某机器中,将消息队列下的专用队列下所有非系统创建的消息队列全部删除,正常情况下,系统创建的队列名称都会是以$符号结尾,比如admin_queue$,其他的队列都是应用程序创建的,之后呢,单独运行每个需要观察的模块,模块运行后,就会在专用队列下创建该模块需要的队列,观察新增的队列名称就可以知道程序需要使用的队列名称。每一个程序模块都只会用一组消息队列,但是编单、上载、播出这三个程序启动的时候,由于是内嵌了素材管理器模块的,该模块也要使用自己独立的消息队列,所以在启动的时候会创建两组消息队列,但是这三个程序中素材管理器所使用的消息队列名称是在系统配置工具中进行配置的。我们可以确切的知道素材管理器的消息队列名称,剩下的一组队列就是编单、上载、播出软件使用的队列了。除了素材管理器队列在系统配置工具中可以设置以外,消息服务器和素材同步服务器使用的队列名称也是可以在系统配置工具中设置的,消息服务器队列设置的位置是:通用配置-消息服务器,素材同步的队列设置是:素材同步服务器-本地消息队列。