MQSeries for SCO Unix V1.4 是一個版本較舊的MQ產品,管理維護與當前開放平台上的V5 系列MQ產品差別較大。本文著重介紹管理維護該產品中與平台相關的特殊之處,其余與平台無關的MQ基本概念與維護方法請參閱相關文檔。
SCO Unix 的custom 命令安裝 MQSeries for SCO Unix 完成後,先修改/etc/services文件 ,插入三行服務定義,為啟動MCAMD進程作准備。
mqmcamd 3000/tcp #MQSeries mcamd
mqoper 3001/tcp #MQSeries oper
mqmca 3002/tcp #MQSeries mca
MCAMD(消息通道代理守護進程)是MQSeries for SCO Unix V1.4 系統的核心進程,管理通道定義數據。消息通道代理(MCA)和MQ管理程序MQM從MCAMD處獲取通道定義。定義MQ隊列管理器中各種部件和啟動MCA通訊前,要先啟動MCAMD 進程。啟動MCAMD進程的命令語法如下:
mcamd [-u user_id] [-g group_id] &
通常系統管理員為MQSeries創建一個專用的用戶和組,以指定的用戶和組啟動MCAMD及其他與MQ相關的進程,可以保證MQ的數據不被其他用戶意外破壞。啟動MCAMD進程時,會出現一個常見錯誤,日志中的錯誤信息如下:
MCAMDOpenConn: Attempt to perform connect to MCAMD named pipe failed error = 111
soc_conn: Error executing socket connect, error = 115
MCAmain: Message Channel Agent Starting, PID = 26544
soc_conn: Error getting host name entry (gethostbyname) SCO_SV
mca_init_mcamd_conn: Attempt to perform connect to MCAMD named pipe failed, error = 115
MCAmain: Unable to connect to the MCAMD process
MCAmain: Message Channel Agent Starting, PID = 26901
parse_command: mca -c ChannelName -f ChannelNameListFile -m QueueMgrName
錯誤原因是不能由主機名 SCO_SV 查找到相應的IP 地址,應先用這條命令檢查主機名:
uname -a
然後把主機名加入/etc/hosts 文件中,如:
169.100.13.22 hosts1 SCO_SV
啟動MCAMD進程後,用mqm命令啟動MQ管理界面,第一次啟動MQ管理界面後顯示隊列管理器定義界面生成隊列管理器,每台機器上只能定義一個隊列管理器。MQ系統運行的錯誤日志記錄在/var/mqi/log目錄下,文件名mqi??.log ,??代表產生錯誤的日期。配置成功後,可以在/etc/inittab或/etc/conf/cf.d/init.base文件中加入一行,使系統每次重新啟動時都啟動MCAMD進程。
mcad:2:respawn:usr/mqi/bin/mcamd -u user_id -g group_id > /dev/console 2>&1
生成隊列管理器後,通常先定義本地隊列,再定義通道和遠程隊列。定義本地隊列時要指定一個文件名,該文件將用於存放進入隊列中的消息數據,文件所在目錄由隊列管理器的屬性決定,默認值時/var/mqi 。配置生產系統前,先估計最大消息數據量,然後劃分一個足夠大的文件系統存放隊列數據文件,並確保MCA進程對隊列數據文件有足夠的讀寫權限,否則MCA進程將無法發送或接收消息。同時要保證MQM進程對該文件系統有足夠的讀寫權限,否則無法在MQM管理界面中定義新的隊列或刪除隊列。
生成隊列管理器後,可以用MQM管理界面做系統管理的大部分工作,只有啟動通道程序必須在管理界面外單獨執行,每個通道程序(即每一個活動的通道)都占用一個端口,在/etc/services文件中指定服務名與端口號的對應關系,在mqm 管理界面中定義通道時必須使用已定義的服務名。MQ for SCO Unix V1.4 與高版本的MQ 不同,沒有默認端口號,與高版本的MQ 連接時要注意。下面是/etc/services 文件中關於MQ 所用的端口號定義片段:
mqmcamd 3000/tcp #MQSeries mcamd
mqoper 3001/tcp #MQSeries oper
mqmca 3002/tcp #MQSeries mca
ch1 3003/tcp #Sender Channel
ch2 3004/tcp #Receiver Channel
MQSeries 1414/tcp #MQSeries mca
其中前三項是支持SCO Unix 上的MQ運行所必須的,第四項指遠端MQ使用的網絡端口號。如果在一台機器上定義多個通道,要注意端口的使用規則:一個端口可以用於多個發送通道(SENDER)或多個請求通道(REQUESTER),但只能用於一個接收通道( RECEIVER )或一個服務器通道(SERVER),而且接收通道和服務器通道使用的端口號不能重復,也不能與發送通道和請求通道使用的端口號重復。
管理MQ的定義時盡量注意以下幾點,可以避免不必要的混亂:
1 檢查通道的定義在發送方和接收方是否一致,MQ V1 與MQ V2 及更高版本的MQ 的通道參數名和默認值不完全一樣。
消息序列號復位值 ( Sequence Wrap Value) 指通道的消息序列號增加到一定值後復位為1 ,在MQ for SCO 中的默認值是999999,而在高版本的MQ 中的默認值是999999999。
通道的批處理量(Batch Size) 指通道程序在一個傳輸事務中傳送的消息數,高版本MQ的參數名是BATCHSZ,MQ for SCO中的參數名是checkpoint count。定義通道時最好把這兩個參數對應置成相同的值。
MQ 上的通道定義中MCA HOSTNAME 要設成主機名,不要設成IP 地址。遠程機器的主機名和IP地址要在/etc/hosts文件中加入定義。
2 MQ for SCO 隊列管理器的字符集編碼(CCSID) 默認值為0 ,與其他平台通訊時注意根據對方字符集編碼設置相應的CCSID 。 如AIX 上的隊列管理器使用字符集819 ,SCO 上的隊列管理器也應使用字符集819 ,或其他與819 屬於同一語言集(即英語)的字符集,如437等。不同語言集的字符集是不能互相轉換的,使用屬於不同語言集的字符集的隊列管理器也不能啟動通道互相交換數據。
3 所有部件的名字最好都用大寫,避免發生名字不匹配的錯誤。在高版本MQ的MQSC 命令界面中小寫的名字要用單引號括起,否則命令處理程序不能正確識別;如果與主機通訊,主機通常都只支持大寫的名字。
最後要注意不要使用太長的名字。
通道代理程序MCA啟動命令如下:
mca -m queue_manager [-f filename] [-c channel_name] [-c channel_name...] &
一個MCA進程可以支持多個通道,在指定的文件中分行列出所有通道或在啟動命令中分別列出所有通道都可以啟動通道。通道啟動後,由於通訊線路故障和系統故障等原因,可能出現發送、接收雙方通道的消息序列號不一致,在錯誤日志出現類似下面的錯誤信息:
18-May-00 11:19:57.800 mca_ack_rcvd: Error flag in ACK set, flags = 2
18-May-00 11:19:57.800 mca_log_nak: QMA.TO.QMB Out of Sequence. Sent MSN 74 when remote expecting MSN 1
這時只需在MQM管理界面中復位消息序列號,通道就能繼續運行。
MQ產品安裝完成後,提供三個例子應用程序及其源代碼:
zmqecho 從一個隊列中讀取消息然後放入另一個隊列
zmqwrite 寫消息到指定隊列中
zmqread 從指定隊列中讀取消息
例子程序的可執行代碼在/usr/mqi/bin目錄下,源代碼及生成可執行程序的make文件放在/usr/mqi/src目錄下。MQI接口的頭文件是cmqc.h ,放在/usr/mqi/include 目錄下。生成可執行程序時要連接MQSeries 產品提供的庫文件/usr/mqi/lib/libmqi.a (鏈接到/usr/lib/libmqi.a)。