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