文 姜大博
本文深入淺出,介紹吉林電視臺(tái)高清頻道的消息服務(wù)器是如何工作,又如何去解決消息服務(wù)的相關(guān)問(wèn)題。
消息服務(wù)可以讓播出系統(tǒng)各個(gè)軟件之間實(shí)現(xiàn)互相聯(lián)系,合作,從而保證各軟件相互獨(dú)立而又緊密通信。消息隊(duì)列是用來(lái)實(shí)現(xiàn)播出軟件不同模塊之間進(jìn)行通信的,它使用結(jié)構(gòu)可以簡(jiǎn)單劃分為消息發(fā)送端、服務(wù)器端、消息訂閱端。
消息隊(duì)列的工作流程是這樣的:首先在所有的模塊啟動(dòng)時(shí)都會(huì)向消息服務(wù)器端進(jìn)行消息訂閱,告訴服務(wù)器需要訂閱那種類(lèi)型的消息,之后如果某個(gè)模塊需要向其他模塊發(fā)消息,這個(gè)模塊就會(huì)將消息發(fā)送到服務(wù)器端,服務(wù)器端會(huì)根據(jù)各個(gè)模塊訂閱消息的類(lèi)型將這個(gè)消息轉(zhuǎn)發(fā)給相應(yīng)模塊的本地消息隊(duì)列中去,之后訂閱端的模塊就會(huì)從本地的隊(duì)列中獲取這個(gè)消息并進(jìn)行相應(yīng)處理。
此流程中,編單軟件先將消息發(fā)送到消息服務(wù)器的消息隊(duì)列中,消息服務(wù)器檢測(cè)到隊(duì)列中有了新的消息,可以根據(jù)消息訂閱情況得知出負(fù)責(zé)播出工作的幾臺(tái)機(jī)器訂閱了這個(gè)消息,之后把這個(gè)消息轉(zhuǎn)發(fā)過(guò)去,這樣負(fù)責(zé)播出工作的幾臺(tái)機(jī)器就可以在本地消息隊(duì)列中讀取編單軟件發(fā)出的這條消息,從而進(jìn)行完成了兩種軟件之間的快速、完美通信,以便進(jìn)行下一步任務(wù)。
此流程中,播出軟件先將消息發(fā)送到消息服務(wù)器的消息隊(duì)列中,消息服務(wù)器檢測(cè)到隊(duì)列中有了新消息,會(huì)根據(jù)消息訂閱情況判斷出上載工作站訂閱了這個(gè)消息,之后把這個(gè)消息轉(zhuǎn)發(fā)到上載工作站的機(jī)器上,這樣負(fù)責(zé)上載工作的幾臺(tái)機(jī)器就可以在本地消息隊(duì)列中讀取播出軟件發(fā)出的這條消息,以便進(jìn)行下一步任務(wù)。
此流程中,播出軟件先將消息發(fā)送到消息服務(wù)器的消息隊(duì)列中,消息服務(wù)器檢測(cè)到隊(duì)列中有了新消息,會(huì)根據(jù)消息訂閱情況判斷出上載工作站訂閱了這個(gè)消息,之后把這個(gè)消息轉(zhuǎn)發(fā)到上載工作站的機(jī)器上,這樣負(fù)責(zé)上載工作的幾臺(tái)機(jī)器就可以在本地消息隊(duì)列中讀取播出軟件發(fā)出的這條消息,以便進(jìn)行下一步任務(wù)。
在素材管理器中添加素材同步的相關(guān)任務(wù),或者選擇重新執(zhí)行某個(gè)失敗的素材管理任務(wù)后,素材同步服務(wù)器可以立即獲取并執(zhí)行相關(guān)任務(wù)。此流程中,素材管理器先將消息發(fā)送到消息服務(wù)器的消息隊(duì)列中,消息服務(wù)器檢測(cè)到隊(duì)列中有了新消息,會(huì)根據(jù)消息訂閱情況判斷素材同步服務(wù)器訂閱了這個(gè)消息,之后把這個(gè)消息轉(zhuǎn)發(fā)過(guò)去。
此流程中,素材管理器先將消息發(fā)送到消息服務(wù)器的消息隊(duì)列中,消息服務(wù)器檢測(cè)到隊(duì)列中有了新消息,會(huì)根據(jù)消息訂閱情況判斷素材同步服務(wù)器訂閱了這個(gè)消息,之后把這個(gè)消息轉(zhuǎn)發(fā)過(guò)去。
此流程中,素材管理器先將消息發(fā)送到消息服務(wù)器的消息隊(duì)列中,消息服務(wù)器檢測(cè)到隊(duì)列中有了新消息,會(huì)根據(jù)消息訂閱情況判播出軟件訂閱了這個(gè)消息,之后把這個(gè)消息轉(zhuǎn)發(fā)過(guò)去。
此流程中,同步服務(wù)器先將消息發(fā)送到消息服務(wù)器的消息隊(duì)列中,消息服務(wù)器檢測(cè)到隊(duì)列中有了新消息,會(huì)根據(jù)消息訂閱情況判斷各個(gè)素材管理器訂閱了這個(gè)消息,之后把這個(gè)消息轉(zhuǎn)發(fā)過(guò)去。
如果消息服務(wù)器正常工作,上述環(huán)境下消息隊(duì)列沒(méi)有起到相應(yīng)作用,可以通過(guò)下列方法判斷問(wèn)題所在。(1)確認(rèn)發(fā)送端和接收端使用的本地消息隊(duì)列是否存在,是否可以正常訪問(wèn)。(2)退出消息服務(wù)器軟件和接收端應(yīng)用程序。(3)在發(fā)送端軟件執(zhí)行一個(gè)可以發(fā)送消息的動(dòng)作,然后到服務(wù)器端消息隊(duì)列中查看消息是否發(fā)送過(guò)去,如果可以看到此條消息,說(shuō)明消息發(fā)送端工作正常;否則,可能是消息發(fā)送端軟件問(wèn)題,它并沒(méi)有向服務(wù)器端發(fā)送消息;是系統(tǒng)配置錯(cuò)誤沒(méi)有指定正確的消息服務(wù)器地址;發(fā)送端和服務(wù)器端的網(wǎng)絡(luò)通訊存在問(wèn)題;服務(wù)器端消息隊(duì)列有問(wèn)題,無(wú)法接受消息。對(duì)于后兩種情況可以換一個(gè)消息發(fā)送端以判斷和排除。(4)如果服務(wù)器端隊(duì)列中已經(jīng)正常收到了消息,可以啟動(dòng)消息服務(wù)器軟件,然后去接收端的消息隊(duì)列中查看消息是否被轉(zhuǎn)發(fā)到本的隊(duì)列,如果可以正常轉(zhuǎn)發(fā)說(shuō)明消息服務(wù)器和訂閱信息都是正確的。否則可能是接收端沒(méi)有在服務(wù)器端正確訂閱消息造成的;或者是接收端消息隊(duì)列不正常造成的。(5)如果消息已經(jīng)被轉(zhuǎn)發(fā)到了接收端的隊(duì)列中,啟動(dòng)接收端的軟件,觀察是否可以正確處理接收到的信息,如果沒(méi)有正確處理,說(shuō)明接收端的軟件在處理消息隊(duì)列是存在問(wèn)題。
如果使用安裝程序時(shí)選擇消息服務(wù)器安裝,則安裝結(jié)束后在安裝目錄下會(huì)生成一個(gè)MSMQ目錄,這個(gè)目錄就是消息服務(wù)器程序所在目錄。安裝程序會(huì)將消息服務(wù)器設(shè)置為開(kāi)機(jī)自動(dòng)啟動(dòng),如果需要手動(dòng)啟動(dòng)消息服務(wù)器,需要在消息服務(wù)器下找到消息服務(wù)器程序DBSMQSvrU.exe,為該程序創(chuàng)建一個(gè)快捷方式,在快捷方式中加上“-debug”的參數(shù),以后直接運(yùn)行就可以啟動(dòng)?xùn)|消息服務(wù)器程序。消息服務(wù)器啟動(dòng)后在操作系統(tǒng)的任務(wù)管理器中的進(jìn)程窗口中,可以看到名為”DBSMQSvrU.exe”的線程,表示消息服務(wù)器正在運(yùn)行。
那么下面來(lái)談一下如何查看消息服務(wù)器的消息訂閱情況。在消息服務(wù)器軟件運(yùn)行的機(jī)器C盤(pán)根目錄,有一個(gè)SubScribe.txt文本文件,里面記錄了消息服務(wù)器收到的所有消息訂閱信息。文本中包含多行文字內(nèi)容,每一行都表示一個(gè)消息訂閱。每行的格式如下:dy bc#clipMgrMsg#dybc#ClipMgrSys#MSG_CLIPMGRSVR表示:dybc這臺(tái)機(jī)器clipMgrMsg和ClipMgrSys這兩個(gè)消息隊(duì)列想消息服務(wù)器定于了消息,CLIPMGRSVR表示訂閱的消息類(lèi)型。如此,當(dāng)消息服務(wù)器接收到CLIPMGRSVR這個(gè)類(lèi)型的消息時(shí),就會(huì)向名稱(chēng)為dybc這個(gè)機(jī)器的clipMgrMsg和ClipMgrSys這兩個(gè)消息隊(duì)列發(fā)送消息。這兩個(gè)隊(duì)列第一個(gè)是消息隊(duì)列第二個(gè)是系統(tǒng)隊(duì)列,我們需要查看的都是具體的消息內(nèi)容,所以只要查看第一個(gè)隊(duì)列匯總的內(nèi)容就可以了。如果出現(xiàn)了消息服務(wù)器不能將消息轉(zhuǎn)發(fā)給指定客戶(hù)端隊(duì)列的情況,就可以在SubScribe.txt中先查詢(xún)消息服務(wù)器是否正確接收了客戶(hù)端的訂閱。如果沒(méi)有,需要在消息服務(wù)器已經(jīng)啟動(dòng)的情況下重新啟動(dòng)客戶(hù)端程序進(jìn)行訂閱,如果已經(jīng)頂躍上了,并且消息已經(jīng)傳送到了消息服務(wù)器的消息隊(duì)列中,就說(shuō)明消息服務(wù)器服務(wù)產(chǎn)生了異常,可以重啟消息服務(wù)器軟件進(jìn)行觀察。
那么如何查看各個(gè)模塊使用的消息隊(duì)列名稱(chēng)?基本上每一個(gè)軟件按模塊都要使用消息隊(duì)列(包括系統(tǒng)隊(duì)列和消息隊(duì)列),我們要知道每個(gè)模塊使用的消息隊(duì)列的名稱(chēng)才可以在消息隊(duì)列出現(xiàn)問(wèn)題的時(shí)候進(jìn)行測(cè)試和查看。要想確認(rèn)每個(gè)模塊使用的消息隊(duì)列名稱(chēng),可以使用以下方法:在某機(jī)器中,將消息隊(duì)列下的專(zhuān)用隊(duì)列下所有非系統(tǒng)創(chuàng)建的消息隊(duì)列全部刪除,正常情況下,系統(tǒng)創(chuàng)建的隊(duì)列名稱(chēng)都會(huì)是以$符號(hào)結(jié)尾,比如admin_queue$,其他的隊(duì)列都是應(yīng)用程序創(chuàng)建的,之后呢,單獨(dú)運(yùn)行每個(gè)需要觀察的模塊,模塊運(yùn)行后,就會(huì)在專(zhuān)用隊(duì)列下創(chuàng)建該模塊需要的隊(duì)列,觀察新增的隊(duì)列名稱(chēng)就可以知道程序需要使用的隊(duì)列名稱(chēng)。每一個(gè)程序模塊都只會(huì)用一組消息隊(duì)列,但是編單、上載、播出這三個(gè)程序啟動(dòng)的時(shí)候,由于是內(nèi)嵌了素材管理器模塊的,該模塊也要使用自己獨(dú)立的消息隊(duì)列,所以在啟動(dòng)的時(shí)候會(huì)創(chuàng)建兩組消息隊(duì)列,但是這三個(gè)程序中素材管理器所使用的消息隊(duì)列名稱(chēng)是在系統(tǒng)配置工具中進(jìn)行配置的。我們可以確切的知道素材管理器的消息隊(duì)列名稱(chēng),剩下的一組隊(duì)列就是編單、上載、播出軟件使用的隊(duì)列了。除了素材管理器隊(duì)列在系統(tǒng)配置工具中可以設(shè)置以外,消息服務(wù)器和素材同步服務(wù)器使用的隊(duì)列名稱(chēng)也是可以在系統(tǒng)配置工具中設(shè)置的,消息服務(wù)器隊(duì)列設(shè)置的位置是:通用配置-消息服務(wù)器,素材同步的隊(duì)列設(shè)置是:素材同步服務(wù)器-本地消息隊(duì)列。