文 姜大博
本文深入淺出,介紹吉林電視臺高清頻道的消息服務器是如何工作,又如何去解決消息服務的相關問題。
消息服務可以讓播出系統各個軟件之間實現互相聯系,合作,從而保證各軟件相互獨立而又緊密通信。消息隊列是用來實現播出軟件不同模塊之間進行通信的,它使用結構可以簡單劃分為消息發送端、服務器端、消息訂閱端。
消息隊列的工作流程是這樣的:首先在所有的模塊啟動時都會向消息服務器端進行消息訂閱,告訴服務器需要訂閱那種類型的消息,之后如果某個模塊需要向其他模塊發消息,這個模塊就會將消息發送到服務器端,服務器端會根據各個模塊訂閱消息的類型將這個消息轉發給相應模塊的本地消息隊列中去,之后訂閱端的模塊就會從本地的隊列中獲取這個消息并進行相應處理。
此流程中,編單軟件先將消息發送到消息服務器的消息隊列中,消息服務器檢測到隊列中有了新的消息,可以根據消息訂閱情況得知出負責播出工作的幾臺機器訂閱了這個消息,之后把這個消息轉發過去,這樣負責播出工作的幾臺機器就可以在本地消息隊列中讀取編單軟件發出的這條消息,從而進行完成了兩種軟件之間的快速、完美通信,以便進行下一步任務。
此流程中,播出軟件先將消息發送到消息服務器的消息隊列中,消息服務器檢測到隊列中有了新消息,會根據消息訂閱情況判斷出上載工作站訂閱了這個消息,之后把這個消息轉發到上載工作站的機器上,這樣負責上載工作的幾臺機器就可以在本地消息隊列中讀取播出軟件發出的這條消息,以便進行下一步任務。
此流程中,播出軟件先將消息發送到消息服務器的消息隊列中,消息服務器檢測到隊列中有了新消息,會根據消息訂閱情況判斷出上載工作站訂閱了這個消息,之后把這個消息轉發到上載工作站的機器上,這樣負責上載工作的幾臺機器就可以在本地消息隊列中讀取播出軟件發出的這條消息,以便進行下一步任務。
在素材管理器中添加素材同步的相關任務,或者選擇重新執行某個失敗的素材管理任務后,素材同步服務器可以立即獲取并執行相關任務。此流程中,素材管理器先將消息發送到消息服務器的消息隊列中,消息服務器檢測到隊列中有了新消息,會根據消息訂閱情況判斷素材同步服務器訂閱了這個消息,之后把這個消息轉發過去。
此流程中,素材管理器先將消息發送到消息服務器的消息隊列中,消息服務器檢測到隊列中有了新消息,會根據消息訂閱情況判斷素材同步服務器訂閱了這個消息,之后把這個消息轉發過去。
此流程中,素材管理器先將消息發送到消息服務器的消息隊列中,消息服務器檢測到隊列中有了新消息,會根據消息訂閱情況判播出軟件訂閱了這個消息,之后把這個消息轉發過去。
此流程中,同步服務器先將消息發送到消息服務器的消息隊列中,消息服務器檢測到隊列中有了新消息,會根據消息訂閱情況判斷各個素材管理器訂閱了這個消息,之后把這個消息轉發過去。
如果消息服務器正常工作,上述環境下消息隊列沒有起到相應作用,可以通過下列方法判斷問題所在。(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$,其他的隊列都是應用程序創建的,之后呢,單獨運行每個需要觀察的模塊,模塊運行后,就會在專用隊列下創建該模塊需要的隊列,觀察新增的隊列名稱就可以知道程序需要使用的隊列名稱。每一個程序模塊都只會用一組消息隊列,但是編單、上載、播出這三個程序啟動的時候,由于是內嵌了素材管理器模塊的,該模塊也要使用自己獨立的消息隊列,所以在啟動的時候會創建兩組消息隊列,但是這三個程序中素材管理器所使用的消息隊列名稱是在系統配置工具中進行配置的。我們可以確切的知道素材管理器的消息隊列名稱,剩下的一組隊列就是編單、上載、播出軟件使用的隊列了。除了素材管理器隊列在系統配置工具中可以設置以外,消息服務器和素材同步服務器使用的隊列名稱也是可以在系統配置工具中設置的,消息服務器隊列設置的位置是:通用配置-消息服務器,素材同步的隊列設置是:素材同步服務器-本地消息隊列。