| |
| Sun Java System Message Queue 3 2005Q1 管理指南 | |
第 6 章
管理實體目標Message Queue 訊息可以經由代理程式上的實體目標,路由至其使用者用戶端。代理程式會管理實體目標的相關記憶體和永久性儲存體,並且設定其運作方式。
您只要在叢集中的一個代理程式上建立實體目標,叢集會將此實體目標傳遞至所有代理程式。應用程式用戶端可以訂閱或使用叢集中任何代理程式上的主題或佇列,因為代理程式會合作跨叢集路由訊息。但是唯有產生訊息的原始代理程式,可以管理訊息的持續性和確認。
本章說明如何執行下列工作:
表 13-5 提供有關使用 imqcmd 子指令來管理實體目標並且完成這些工作的完整參照資訊。
備註
用戶端應用程式與實體目標互動時,必定使用 Destination 物件。為了供應程式獨立性和可移植性,用戶端通常使用管理員建立的目標物件,又稱目標受管理物件。您可以如第 8 章「管理受管理物件」中所描述,配置由用戶端應用程式使用受管理物件。
使用 imqcmd 指令公用程式imqcmd 指令公用程式可讓您管理實體目標。imqcmd 指令的語法和您使用它來管理其他代理程式服務時相同。
如需有關 imqcmd、其子指令和選項的完整參照資訊,請參閱第 13 章「指令參照」。
子指令
表 6-1 列出本章中描述的 imqcmd 子指令。如需有關這些子指令的參照資訊,請參閱實體目標管理子指令。
建立實體目標若要建立實體目標,您可以使用 imqcmd create 子指令。create 子指令的語法如下:
create dst -t destType -n destName [-o property=value] [-o property=value1]…
建立實體目標時,您必須指定以下項目:
更新實體目標時,您也可以設定特性。
很多實體目標特性可以管理代理程式記憶體資源和訊息流量。例如,您可以指定能夠傳給實體目標的產生者數目、產生者可以傳送的訊息數量和容量,以及到達實體目標限制時代理程式的回應方式。這些限制類似代理程式配置特性控制的代理程式範圍限制。
下列特性可用於佇列目標和主題目標:
- maxNumMsgs。指定實體目標中允許給未使用訊息的最大數目。
- maxTotalMsgBytes。指定實體目標中允許給未使用訊息的最大總記憶體容量 (以位元組為單位)。
- limitBehavior。指定達到記憶體限制臨界值時,代理程式回應的方式。
- maxBytesPerMsg。指定實體目標中允許的任何單一訊息的最大容量 (以位元組為單位)。
- maxNumProducers。指定實體目標中產生者的最大數目。
- consumerFlowLimit。指定最大訊息數目,這些訊息將會傳送給單一批次中的某個用戶。
- isLocalOnly。僅套用於代理程式叢集。指定在其他代理程式上不重複實體目標,且限制目標僅傳送訊息給本地用戶 (連線到有建立實體目標代理程式的用戶)。
- useDMQ。指定捨棄實體目標的停用訊息或放到停用的訊息佇列中。
下列特性僅用於佇列目標:
如需實體目標特性的完整參照資訊,請參閱第 15 章「實體目標特性參照」。
針對自動建立的目標,請在代理程式實例配置檔案中設定預設特性值。表 14-4 中有自動建立特性的參照資訊。
建立實體目標
列出實體目標您可以取得關於實體目標目前特性值的相關資訊、關於與實體目標相關之產生者或用戶的數目以及關於訊息傳送度量的資訊,例如實體目標中訊息的數目和大小。
若要尋找您需要資訊的實體目標,請先列出代理程式的所有實體目標。您可以使用 list dst 子指令來列出。dst 子指令的語法如下:
list dst [-t destType] [-tmp]
這個指令可以列出所指定類型的實體目標。目標類型 (-t) 選項的值有 q (queue) 或 t (topic)。
如果省略目標類型,則會列出所有類型的實體目標。
list dst 子指令可選擇性指定要列出的目標類型,或選擇性納入暫存目標 (使用 -tmp 選項)。用戶端建立的暫存目標,通常用來接收傳送到其他用戶端的訊息回應。
例如,若要取得在連接埠 4545 的 myHost 上執行之代理程式的所有實體目標,請輸入以下指令:
imqcmd list dst -b myHost:4545
除了其他實體目標之外,停用的訊息佇列 mq.sys.dmq 也一定會出現,除非您指定只包含主題的目標類型 t。
顯示實體目標資訊若要取得實體目標目前的特性值的相關資訊,請使用 query dst 子指令。query dst 子指令的語法如下:
query dst -t destType -n destName
這個指令列出指定類型和名稱之目標的相關資訊。例如:
imqcmd query dst -t q -n XQueue -u admin
此指令的輸出如下:
輸出也會顯示與目標相關之產生者與用戶的數目。佇列目標的這個數目包含使用中用戶和備份用戶。
您可以使用 update dst 子指令來變更一或多個特性值 (請參閱更新實體目標特性)。
更新實體目標特性透過使用 update dst 子指令和 -o 選項指定要更新的特性,您可以變更實體目標的特性。update dst 子指令的語法如下:
update dst -t destType -n destName -o property=value [-o property=value1]…
這個指令會更新指定目標上的指定特性的值。特性名稱可能是表 15-1 中描述的任何特性。
您可以多次使用 -o 選項,更新多個特性。例如,以下指令將 maxBytesPerMsg 特性變更為 1000,並將 MaxNumMsgs 特性變更為 2000:
imqcmd update dst -t q -n myQueue -o "maxBytesPerMsg=1000"
-o "maxNumMsgs=2000” -u admin請參閱第 15 章「實體目標特性參照」,以獲得您可以更新的特性清單。
您無法使用 update dst 子指令更新實體目標的類型或更新 isLocalOnly 特性。
備註
停用的訊息佇列是一特殊的實體目標,它的特性與其他目標的特性不同。如需更多資訊,請參閱配置使用停用的訊息佇列。
暫停和繼續實體目標您可以暫停實體目標,以便控制從產生者傳送訊息到目標,或從目標傳送訊息到用戶,或同時控制上述兩個動作。要特別注意的是,您可以暫停到目標的訊息流量,以避免目標在訊息產生速度高於使用速度時收到過多訊息。
若要暫停傳送到實體目標的訊息或暫停從實體目標傳送的訊息,請使用 pause dst 子指令。pause dst 子指令的語法如下:
pause dst [-t destType -n destName] [-pst pauseType]
針對指定類型和名稱的目標,這個子指令可以暫停至用戶的訊息傳送
(-pst CONSUMERS),或暫停來自產生者的訊息傳送 (-pst PRODUCERS),或者兩者皆暫停 (-pst ALL)。如果沒有指定目標類型與名稱,則會暫停所有實體目標。預設為 ALL。範例︰
imqcmd pause dst -n myQueue -t q -pst PRODUCERS -u admin
imqcmd pause dst -n myTopic -t t -pst CONSUMERS -u admin
若要繼續向暫停的目標傳送,請使用 resume dst 子指令。resume dst 子指令的語法如下:
resume dst [-t destType -n destName]
這個子指令繼續向指定類型和名稱之暫停目標傳送訊息。如果沒有指定目標類型與名稱,所有目標都會繼續。
範例︰
imqcmd resume dst -n myQueue -t q
在代理程式叢集中,實體目標實例會常駐在叢集中的每個代理程式。您必須個別暫停。
清除實體目標您可以清除目前在實體目標上形成佇列的所有訊息。清除實體目標意味著刪除在實體目標上形成佇列的所有訊息。
當累積的訊息佔用太多的系統資源時,您可能需要清除訊息。當佇列沒有註冊的使用者用戶端並要接收許多訊息時,可能需要清除訊息。如果非使用中的主題長期用戶未成為使用中的用戶,也可能需要清除訊息。在這兩種情況下,訊息均會被不必要地保留。
若要清除實體目標上的訊息,請使用 purge dst 子指令。purge dst 子指令的語法如下:
purge dst -t destType -n destName
這個子指令清除在指定類型與名稱的實體目標上的訊息。
範例:
imqcmd purge dst -n myQueue -t q -u admin
imqcmd purge dst -n myTopic -t t -u admin
如果您已關閉代理程式,並且不想在重新啟動它時傳送舊的訊息,請使用 -reset messages 選項清除舊的訊息,例如:
imqbrokerd -reset messages -u admin
這可避免重新啟動代理程式後清除目標的麻煩。
在代理程式叢集中,實體目標實例會常駐在叢集中的每個代理程式。您必須個別清除這些目標。
銷毀實體目標若要銷毀實體目標,請使用 destroy dst 子指令。destroy dst 子指令的語法如下:
destroy dst -t destType -n destName
這個子指令會銷毀指定類型與名稱的實體目標。
範例︰
imqcmd destroy dst -t q -n myQueue -u admin
銷毀實體目標會清除此目標上的所有資訊,並從代理程式中移除此目標;此作業不可復原。
您不能銷毀停用的訊息佇列。
壓縮實體目標如果您使用內建且基於檔案的資料儲存 (而非外掛式 JDBC 相容的資料儲存) 作為用於訊息的永久性儲存,您可以監視磁碟使用和壓縮磁碟 (需要時)。
建立基於檔案的訊息儲存,以便根據訊息於實體目標的位置,將訊息儲存在目錄中。在各個實體目標的目錄中,大部分的訊息會儲存在一個智慧型記錄 (即智慧型記錄檔案) 組成的檔案中。(若要減少分段程序,大小超過可配置臨界值的訊息會儲存在其個別的檔案中。)
因為會存留不同大小的訊息,接著從智慧型記錄檔案移除這些訊息,所以檔案中可能會產生空白片段,且將無法再重新使用這些可用記錄。
若要管理未使用的可用記錄,使用率下降時,指令公用程式包括每個實體目標監視磁碟使用及回收可用磁碟空間的子指令。
監視實體目標的磁碟使用
若要監視實體目標的磁碟使用,請使用下列指令:
imqcmd metrics dst -t q -n myQueue -m dsk -u admin
此指令的輸出如下:
--------------------------------------
保留的 使用的 使用率
--------------------------------------
806400 804096 99
1793024 1793024 100
2544640 2518272 98
子指令輸出中的欄有以下意思:
表 6-2 實體目標磁碟使用度量
度量
說明
保留的
所有記錄使用的磁碟空間 (以位元組為單位),包括保留使用中訊息和等待被重新使用之可用記錄的記錄
使用的
保留使用中訊息的記錄所使用的磁碟空間 (以位元組為單位)
使用率
使用的磁碟空間除以保留的磁碟空間所得之商數。比率越高表示有越多磁碟空間被用來保留使用中訊息。
回收未使用的實體目標磁碟空間
磁碟使用模式依使用特定實體目標之訊息傳送應用程式的特徵而異。根據流入和流出實體目標的相關訊息流量和相關的訊息大小,保留的磁碟空間可能會不斷增加。
如果訊息產生速率大於訊息使用速率,那麼通常會重新使用可用記錄,且使用率應較高。但是,如果訊息產生速率與訊息使用速率相似或小於訊息使用速率,那麼使用率會比較低。
一般而言,您會穩定保留的磁碟空間並保持高使用率。通常如果系統到達一個穩定狀態,即保留的磁碟空間大致固定且使用率高 (75% 以上),那麼就沒有需要回收未使用的磁碟空間。如果系統到達穩定狀態且使用率低 (50% 以下),您可以壓縮磁碟,回收可用記錄佔用的磁碟空間。
compact dst 子指令可用來壓縮資料儲存。compact dst 子指令的語法如下:
compact dst [-t destType -n destName]
這個子指令壓縮用於指定類型與名稱之實體目標的內建且基於檔案的資料儲存。如果沒有指定目標類型與名稱,所有目標都會壓縮。必須在壓縮目標前暫停實體目標。
如果保留的磁碟空間不斷增加,請藉由設定目標記憶體限制特性和限制運作方式,重新配置目標的記憶體管理 (請參閱表 15-1)。
回收未使用的實體目標磁碟空間如果未指定目標類型和名稱,則會在所有實體目標上執行這些作業。
配置使用停用的訊息佇列停用的訊息佇列 , mq.sys.dmq 是系統建立的實體目標,保留代理程式的停用訊息和它的其他實體目標。停用的訊息佇列是用來監視、調校系統效率以及疑難排解的工具。如需「停用的訊息」一詞的定義和停用的訊息佇列的詳細資訊,請參閱 Message Queue 技術概述。
代理程式啟動時會自動建立停用的訊息佇列。代理程式將無法處理或到期的訊息放在此佇列中。此外,其他實體目標可以使用停用的訊息佇列來保留已捨棄的訊息。使用停用的訊息佇列而提供的資訊,有助於系統的疑難排解。
配置使用停用的訊息佇列
依預設,系統會配置實體目標使用停用的訊息佇列。您可以設定實體目標特性 useDMQ,讓實體目標使用或不使用停用的訊息佇列。
下列範例建立的佇列 myDist,依預設使用停用的訊息佇列:
imqcmd create dst -n -myDist -t q
下列範例讓相同的佇列停用此停用的訊息佇列:
imqcmd update dst -n myDist -t q -o useDMQ=false
您可以設定 imq.autocreate.destination.useDMQ 代理程式特性,讓代理程式上所有自動建立的實體目標使用或不使用停用的訊息佇列。
配置及管理停用的訊息佇列
imqcmd 指令公用程式可以管理停用的訊息佇列。管理停用的訊息佇列的方式與管理其他佇列的方式,稍有不同。例如,停用的訊息佇列是系統建立的,因此您不能建立、暫停或銷毀。
停用的訊息佇列特性
您可以使用配置其他佇列的方式來配置停用的訊息佇列,但是有些實體目標特性可能不套用或是預設值不同。表 6-3 列出停用的訊息佇列另以特殊方式處理的佇列特性。
表 6-3 停用的訊息佇列處理標準實體目標特性的方式
特性
停用的訊息佇列的處理方式
limitBehavior
停用的訊息佇列的預設值是 REMOVE_OLDEST。其他佇列的預設值是 REJECT_NEWEST。停用的訊息佇列不支援流量控制。
localDeliveryPreferred
不套用於停用的訊息佇列。
maxNumMsgs
停用的訊息佇列的預設值是 1000。其他佇列的預設值是 -1 (無限制)。
maxNumProducers
不套用於停用的訊息佇列。
maxTotalMsgBytes
停用的訊息佇列的預設值是 10 MB。其他佇列的預設值是 -1 (無限制)。
isLocalOnly
代理程式叢集中的停用的訊息佇列一定是本機實體目標,其特性一定設定為 true。但是,本機代理程式的停用的訊息佇列可以包含叢集中其他代理程式的用戶端產生的訊息,前提是如果本機代理程式將訊息標示為停用。
訊息內容
代理程式可以將整個訊息放入停用的訊息佇列中,或是捨棄訊息內文內容,只保留標頭和特性資料。依預設,停用的訊息佇列儲存整個訊息。
如果您想減少佇列大小或不打算復原停用的訊息,可以考慮捨棄內文內容。
若要捨棄內文內容,只保留標頭和特性資料,請如下列範例所示,將 imq.destination.DMQ.truncateBody 代理程式特性設定為 true:
imqcmd update bkr -o imq.destination.DMQ.truncateBody=true
啟用停用訊息記錄功能
除了標準的佇列監視和記錄選項,您還可以記錄代理程式分類為停用的訊息。
如果啟用停用訊息記錄功能,代理程式會記錄下列類型的事件:
依預設,不記錄停用的訊息。下列範例記錄停用的訊息:
imqcmd update bkr -o imq.destination.logDeadMsgs=true
停用訊息記錄功能套用於所有使用停用的訊息佇列的實體目標。您不能啟用或停用個別實體目標的記錄功能。