Sun Java logo     上一頁      目錄      索引      下一頁     

Sun logo
Sun Java System Message Queue 3 2005Q4 管理指南 

第 8 章
管理受管理物件

管理物件會封裝提供者特定的配置和命名資訊,這樣能開發可以從 JMS 提供者移植到其他提供者的用戶端應用程式。Message Queue 管理員通常會為用戶端應用程式建立管理物件,使其能夠與代理程式建立連線,進行傳送與接收訊息。

本章說明如何使用物件管理員公用程式 (imqobjmgr) 來建立與管理受管理物件。包含下列各節:


物件存放區

管理物件會置於即時可用的物件存放區中,用戶端應用程式可透過 Java Naming and Directory Interface (JNDI) 存取此處的管理物件。您可以使用兩種類型的物件存放區︰標準的簡易資料存取協定 (LDAP) 目錄伺服器或本機檔案系統的目錄。

LDAP 伺服器物件存放區

LDAP 伺服器是用於生產訊息傳送系統的建議物件存放區。LDAP 伺服器是專為在分散式系統中使用而設計的,並提供在生產環境中非常有用的安全性功能。

有多家供應商提供 LDAP 實作。若要使用 Message Queue 管理工具來管理 LDAP 伺服器上的物件存放區,首先需要將伺服器配置成可以儲存 Java 物件並執行 JNDI 查詢。請參閱 LDAP 實作所隨附的文件,以取得詳細資訊。

使用 LDAP 伺服器作為物件存放區時,您必須指定表 8-1 中所顯示的屬性。這些屬性分為以下幾個種類:

檔案系統物件存放區

Message Queue 也支援在本機檔案系統中使用目錄,以作為管理物件的物件存放區。建議您對生產系統不要使用此方法,此方法在開發環境中具有使用簡單方便的優點。但是請注意,如果跨多個電腦節點部署的用戶端將目錄用作集中物件存放區,則這些用戶端都必須擁有該目錄的存取權。除此之外,任何對此目錄擁有存取權的使用者,均可使用 Message Queue 管理工具以建立並管理受管理物件。

使用檔案系統目錄作為物件存放區時,您必須指定表 8-2 中所顯示的屬性。這些屬性大致和上述 LDAP 物件存放區相同,特別是 java.naming.provider.url 屬性會指定保留物件存放區之目錄的路徑。該目錄必須存在,且 Message Queue 管理工具的使用者與用戶端應用程式的使用者皆擁有適當的存取權限,以供存取存放區。

表 8-2 檔案系統物件存放區屬性 

屬性

說明

java.naming.factory.initial

JNDI 查詢的初始環境

範例︰

com.sun.jndi.fscontext.RefFSContextFactory

java.naming.provider.url

目錄路徑

範例︰

file:///C:/myapp/mqobjs


管理物件屬性

Message Queue 管理物件有兩種基本類型:

這兩種管理物件類型均包含決定物件特性及運作方式的屬性。本節描述如何使用物件管理員指令行公用程式 (imqobjmgr) 來設定這些屬性,您也可以使用 GUI 管理主控台進行設定,如第 2 章所述 (請參閱使用管理物件)。

連線工廠屬性

用戶端應用程式使用連線工廠管理物件,建立與代理程式交換訊息的連線。連線工廠的屬性會定義由其建立的所有連線之特性。連線一旦建立後,就無法變更其特性,因此配置連線特性的唯一方法,就是設定用以建立連線之連線工廠的屬性。

Message Queue 定義兩種類別的連線工廠物件:

這兩種類別共用相同的配置屬性,您可以使用這些屬性最佳化資源、效能和訊息流量。第 16 章「管理物件屬性參照」中列出這些屬性並有詳細說明,下列各節將進行討論:

連線處理

連線處理屬性會指定要連線的訊息伺服器位址,並會視需要指定偵測連線失敗和嘗試重新連線的方式。在表 16-1 中會對其進行摘要。

訊息伺服器位址清單

最重要的連線處理屬性是 imqAddressList,該屬性會指定要與其建立連線的代理程式。此屬性值是包含訊息伺服器位址或 (如果是代理程式叢集) 由逗號分隔的多項位址之字串。視所使用的連線服務 (請參閱連線服務) 和建立連線的方法之不同,伺服器位址可使用多種定址方案:

這些定址方案在表 16-2 中有所摘要。

每個訊息伺服器位址的一般格式為:

scheme://address

其中 scheme 是上述所列的其中一個定址方案,而 address 則表示伺服器位址本身。指定位址的實際語法會根據定址方案而有所差異,如表 16-2 最後一欄所示。表 16-3 會顯示各種位址格式的範例。

在多個代理程式叢集環境中,位址清單可包含多個伺服器位址。如果第一個連線嘗試失敗,Message Queue 用戶端執行階段會嘗試連線至清單中的其他位址,一直到使用完清單上所有位址為止。有兩個其他的連線工廠屬性會控制完成此作業的方式:

自動重新連線

您可以將連線工廠的 imqReconnectEnabled 屬性設定成 true,可讓用戶端在連線失敗時,能自動重新連線至代理程式。imqReconnectAttempts 屬性會控制重新連線至指定伺服器位址的嘗試次數;imqReconnectInterval 會指定每次嘗試之間等待的時間間隔 (以毫秒為單位)。

訊息伺服器位址清單 (imqAddressList) 在代理程式叢集中會指定多個位址,失敗的連線不只會在原始代理程式上復原,也會在叢集中其他代理程式上復原。如果重新連線至原始代理程式失敗,則用戶端執行階段將會嘗試清單中的其他位址。如上節所述,imqAddressListBehaviorimqAddressListIterations 屬性會控制嘗試位址的順序,以及清單循環的次數。每個位址會以 imqReconnectInterval 毫秒的間隔重複嘗試,嘗試次數上限由 imqReconnectAttempts 指定。

自動重新連線支援訊息使用的所有用戶端確認模式。連線一旦重新建立,代理程式就會重新傳送之前已傳送但尚未確認的所有訊息,並使用「重新傳送」旗標加以標示。應用程式碼可使用此旗標來判斷是否有已使用但尚未確認的訊息。(如果不是長期用戶,一旦關閉連線,訊息伺服器並不會保留訊息。因此當連線關閉時,這類用戶所產生的任何訊息將無法在重新連線後傳送,且會遺失。) 進行自動重新連線時會阻斷訊息的產生,因此訊息產生者在連線尚未重新建立之前,無法傳送訊息到伺服器。

自動重新連線可提供連線容錯移轉,但不提供資料容錯移轉:當用戶端自動重新連線至不同的代理程式實例時,失敗或斷線的代理程式所保留的永久性訊息和其他狀態資訊將會遺失。嘗試重新建立連線時,Message Queue 會維護用戶端執行階段所提供的物件 (例如階段作業、訊息用戶和訊息產生者)。當連線失敗時,也會短暫維護暫時目標,因為用戶端可能會重新連線並再次存取這些目標;在提供用戶端時間重新連線並使用這些目標之後,代理程式即會刪除這些目標。如果重新連線後,用戶端狀態無法完全在代理程式上復原 (例如,當使用已處理的階段作業時,只有在連線期間才存在這些階段作業),將不會發生自動重新連線,且會呼叫連線的異常處理程式。接著會由應用程式碼擷取異常、重新連線及復原狀態。

定期測試 (偵測) 連線

Message Queue 用戶端執行階段可以配置成定期測試或「偵測」連線,在嘗試的訊息傳輸失敗前,就事先偵測到連線失敗。當用戶端應用程式只會使用訊息而不會產生訊息時,此測試特別重要,因為這類應用程式無法偵測到連線失敗。很少產生訊息的用戶端也可受惠於此功能。

連線工廠屬性 imqPingInterval 會指定偵測連線的頻率 (以秒為單位)。依預設,間隔時間設定為 30 秒,數值 -1 表示停用偵測作業。

偵測失敗的回應會根據不同的作業系統平台而有所差異。在某些系統上,會立即對用戶端應用程式的異常偵聽程式產生一個異常。(如果用戶端沒有異常偵聽程式,下次嘗試使用連線將失敗。) 其他的系統可能會繼續嘗試建立與代理程式的連線,緩衝連續的偵測,直到偵測成功或緩衝區溢位為止。

用戶端標識

表 16-4 中所列的連線工廠屬性,支援用戶端認證以及長期用戶的用戶端識別碼設定。

用戶端認證

連線至代理程式的所有嘗試,必須透過將使用者名稱和密碼與訊息伺服器維護的使用者儲存庫進行對照的方式認證。如果用戶端在建立連線時,未明確提供使用者名稱和密碼,則會由連線工廠屬性 imqDefaultUsernameimqDefaultPassword 指定要使用的預設使用者名稱和密碼。

Message Queue 提供 guest 使用者帳戶 (其中使用者名稱和密碼均為 guest),以省去開發者在應用程式開發和測試期間需要寫入使用者儲存庫的麻煩。這也是 imqDefaultUsernameimqDefaultPassword 屬性的預設值,因此如果這些屬性沒有明確指定,用戶端一律可以使用 guest 帳戶取得連線。在生產環境中,對代理程式連線的存取應僅限於在使用者儲存庫中明確註冊的使用者。

用戶端識別碼

每當訊息伺服器必須代表用戶端維護永久性狀態時,「Java Message Service 規格」會要求連線提供唯一的用戶端識別碼 。Message Queue 使用這類用戶端識別碼,追蹤主題目標的長期用戶。如果長期用戶變為非使用中,代理程式會保留該主題的所有內送訊息,等到用戶恢復為使用中時再傳送這些訊息。代理程式會藉由用戶端識別碼來識別用戶。

用戶端應用程式可能會使用連線物件的 setClientID 方法,透過程式設計來設定自己的用戶端識別碼,因此很難協調用戶端識別碼並確保每個識別碼都是唯一的。通常比較好的方式是讓 Message Queue 在代表用戶端建立連線時,自動指定唯一的識別碼。若要這麼做,請將連線工廠的 imqConfiguredClientID 屬性設定為下列格式的值

${u}factoryID

${u} 字元必須為屬性值的前四個字元。(在括弧之間若有 u 以外的其他字元,會造成在建立連線時產生一個異常;如果是在其他位置,則這些字元並不具有任何特殊意義,而會被當作是純文字來處理。) factoryID 的值是與此連線工廠物件唯一關聯的字元字串。

為特定用戶端建立連線時,Message Queue 會以 u:userName 取代 ${u} 字元,以建構用戶端識別碼,其中 userName 是供連線認證的使用者名稱。這可確保指定連線工廠所建立的連線雖然其他各方面皆完全相同,但仍會有各自唯一的用戶端識別碼。例如,如果使用者名稱是 Calvin,而為連線工廠的 imqConfiguredClientID 屬性指定的字串是 ${u}Hobbes,則指定的用戶端識別碼會是 u:CalvinHobbes


備註

如果有兩個用戶端使用預設的使用者名稱 guest 嘗試取得連線,則無法使用此方案,因為這兩個用戶端的用戶端識別碼會有相同的 ${u} 元件。在這種情況下,只有第一個請求連線的用戶端才能取得連線,第二個嘗試連線的用戶端則會失敗,因為 Message Queue 無法使用同一用戶端識別碼建立兩個連線。


即使您使用 imqConfiguredClientID 指定用戶端識別碼,用戶端應用程式還是會使用連線方法 setClientID 覆寫此設定值。您可以將連線工廠的 imqDisableSetClientID 屬性設定為 true,以避免這種情況。請注意,對於使用長期用戶的應用程式,其用戶端識別碼必須以下列兩種方法之一進行設定:使用 imqConfiguredClientID 以管理員方式設定,或者使用 setClientID 以程式設計方式設定。

可靠性和流量控制

由於用戶端傳送與接收的「有效負載」訊息以及 Message Queue 本身使用的控制訊息 (例如代理程式確認) 透過相同的用戶端與代理程式連線傳送,因此過量的有效負載流量可能會干擾控制訊息的傳送。若要協助減輕此問題,表 16-5 中所列的連線工廠屬性可讓您管理這兩種訊息類型的相關流量。這些屬性可分為四種:

使用這些流量控制技術必須在可靠性與流量之間進行取捨;如需詳細說明,請參閱用戶端執行階段訊息流量調校

佇列瀏覽器和伺服器階段作業

表 16-6 會列出影響用戶端佇列瀏覽與伺服器階段作業的連線工廠屬性。imqQueueBrowserMaxMessagesPerRetrieve 屬性會指定瀏覽佇列目標內容時,一次擷取的最大訊息數量;imqQueueBrowserRetrieveTimeout 會提供擷取訊息的最長等待時間。布林屬性 imqLoadMaxToServerSession 管理連線用戶在應用程式伺服器階段作業中的運作方式:若此屬性值為 true,用戶端將上載最大數量的訊息到伺服器階段作業中;若為 false,用戶端則僅會一次載入一個訊息。

標準訊息特性

「Java Message Service 規格」會定義部分標準訊息特性,JMS 提供者 (例如,Message Queue ) 會選擇性支援這些特性。根據慣例,所有這類標準特性的名稱會以字母 JMSX 開頭。表 16-7 中所列的連線工廠屬性可控制Message Queue 用戶端執行階段是否設定特定的標準特性。若是產生的訊息,則包括下列特性:

若是使用的訊息,則包括

訊息標頭覆寫

您可以使用表 16-8 中所列的連線工廠屬性,覆寫用戶端為部分 JMS 訊息標頭欄位設定的值。由該連線工廠取得的連線所產生之所有訊息會使用您指定的設定值。您可以此方式覆寫的標頭欄位包括:

每個欄位均有兩個屬性:一個是控制能否覆寫欄位的布林值,另一個是指定該布林值。例如,設定優先順序層級的屬性有 imqOverrideJMSPriorityimqJMSPriority。另外還有一個屬性 imqOverrideJMSHeadersToTemporaryDestinations,它會控制覆寫值是否會套用到暫時目標。


備註

由於覆寫這些訊息標頭可能會干擾特定應用程式的需求,請先諮詢應用程式設計者或使用者後,再使用這些屬性。


目標屬性

識別實體佇列或主題目標的目標管理物件只有兩個屬性,如表 16-9 所列。重要的屬性是 imqDestinationName,其提供此管理物件所代表的實體目標名稱;該名稱已使用建立實體目標的 imqcmd create dst 指令之 -n 選項來指定。另外還有一個選擇性描述字串 imqDestinationDescription,可用以協助您識別目標物件,並與您之前建立的物件進行區分。


使用物件管理員公用程式

Message Queue 物件管理員公用程式 (imqobjmgr) 可讓您建立並管理受管理物件。imqobjmgr 指令提供下列子指令,以在管理物件上執行各種作業:

如需 imqobjmgr 指令的語法、子指令和選項之參照資訊,請參閱物件管理員公用程式

大多數物件管理員作業需要您指定下列資訊以作為 imqobjmgr 指令的選項:

新增管理物件

imqobjmgr 指令的 add 子指令,會將連線工廠和主題或佇列目標的管理物件新增至物件存放區。儲存在 LDAP 物件存放區中的管理物件必須擁有以 cn= 開頭的查詢名稱字首;檔案系統物件存放區中的查詢名稱則不需要有特定的字首,但是絕對不能包含斜線字元 (/)。


備註

物件管理員僅會列出與顯示 Message Queue 管理物件。如果物件存放區應包含的非 Message Queue 物件,與您想新增的管理物件具有相同的查詢名稱,則當您嘗試新增作業時會出現錯誤。


新增連線工廠

若要讓用戶端應用程式能建立代理程式連線,請為要建立的連線類型新增連線工廠管理物件:佇列連線工廠或主題連線工廠。程式碼範例 8-1顯示將佇列連線工廠 (管理物件類型 qf) 新增至 LDAP 物件存放區所使用的指令。物件具有查詢名稱 cn=myQCF,並使用 jms 連線服務連線至連接埠號碼 7272 之主機 myHost 上所執行的代理程式。

程式碼範例 8-1 新增連線工廠

imqobjmgr add

   -l "cn=myQCF"

   -j "java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory"

   -j "java.naming.provider.url=ldap://mydomain.com:389/o=imq"

   -j "java.naming.security.principal=uid=homerSimpson,ou=People,o=imq"

   -j "java.naming.security.credentials=doh"

   -j "java.naming.security.authentication=simple"

   -t qf

   -o "imqAddressList=mq://myHost:7272/jms"

新增目標

建立代表目標的管理物件時,最好先建立實體目標,再將管理物件新增至物件存放區中。使用指令公用程式 (imqcmd) 建立實體目標,如建立實體目標所述。

程式碼範例 8-2 中顯示的指令會將管理物件新增至代表主題目標之 LDAP 物件存放區,且該目標的查詢名稱為 myTopic,實體目標名稱為 physTopic。新增佇列目標的指令很類似,不同之處在於管理物件類型 (-t 選項) 為 q (表示佇列目標),而非 t (表示主題目標)。

程式碼範例 8-2 將目標新增至 LDAP 物件存放區

imqobjmgr add

   -l "cn=myTopic"

   -j "java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory"

   -j "java.naming.provider.url=ldap://mydomain.com:389/o=imq"

   -j "java.naming.security.principal=uid=homerSimpson,ou=People,o=imq"

   -j "java.naming.security.credentials=doh"

   -j "java.naming.security.authentication=simple"

   -t t

   -o "imqDestinationName=physTopic"

程式碼範例 8-3 顯示相同的指令,但是管理物件存放區在 Solaris 檔案系統中,而不是在 LDAP 伺服器中。

程式碼範例 8-3 將目標新增至檔案系統物件存放區

imqobjmgr add

   -l "cn=myTopic"

   -j "java.naming.factory.initial=

           com.sun.jndi.fscontext.RefFSContextFactory"

   -j "java.naming.provider.url=file:///home/foo/imq_admin_objects"

   -t t

   -o "imqDestinationName=physTopic"

刪除管理物件

若要從物件存放區刪除管理物件,請使用 imqobjmgr 指令的 delete 子指令,指定要刪除的物件之查詢名稱、類型和位置。程式碼範例 8-4 中顯示的指令會刪除上述程式碼範例 8-2 中新增的物件。

程式碼範例 8-4 刪除管理物件

imqobjmgr delete

   -l "cn=myTopic"

   -j "java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory"

   -j "java.naming.provider.url=ldap://mydomain.com:389/o=imq"

   -j "java.naming.security.principal=uid=homerSimpson,ou=People,o=imq"

   -j "java.naming.security.credentials=doh"

   -j "java.naming.security.authentication=simple"

   -t t

列出管理物件

您可以使用物件管理員的 list 子指令,會列出物件存放區中或特定類型的所有管理物件。程式碼範例 8-5 顯示如何列出 LDAP 伺服器上所有的管理物件。

程式碼範例 8-5 列出所有管理物件  

imqobjmgr list

   -j "java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory"

   -j "java.naming.provider.url=ldap://mydomain.com:389/o=imq"

   -j "java.naming.security.principal=uid=homerSimpson,ou=People,o=imq"

   -j "java.naming.security.credentials=doh"

   -j "java.naming.security.authentication=simple"

程式碼範例 8-6 列出所有佇列目標 (類型 q)。

程式碼範例 8-6 列出特定類型的管理物件

imqobjmgr list

   -j "java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory"

   -j "java.naming.provider.url=ldap://mydomain.com:389/o=imq"

   -j "java.naming.security.principal=uid=homerSimpson,ou=People,o=imq"

   -j "java.naming.security.credentials=doh"

   -j "java.naming.security.authentication=simple"

   -t q

檢視管理物件資訊

query 子指令會顯示特定管理物件的相關資訊,該物件經由物件的查詢名稱和包含物件的物件存放區屬性加以識別。程式碼範例 8-7 會顯示查詢名稱為 cn=myTopic 之物件的相關資訊。

程式碼範例 8-7 檢視管理物件資訊

imqobjmgr query

   -l "cn=myTopic"

   -j "java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory"

   -j "java.naming.provider.url=ldap://mydomain.com:389/o=imq"

   -j "java.naming.security.principal=uid=homerSimpson,ou=People,o=imq"

   -j "java.naming.security.credentials=doh"

   -j "java.naming.security.authentication=simple"

修改管理物件屬性

若要修改管理物件的屬性,請使用 imqobjmgr update 子指令。請提供物件的查詢名稱和位置,再使用 -o 選項指定新的屬性值。

程式碼範例 8-8 是針對程式碼範例 8-1 中新增至物件存放區的佇列連線工廠變更了 imqReconnectAttempts 屬性值。

程式碼範例 8-8 修改管理物件的屬性

imqobjmgr update

   -l "cn=myQCF"

   -j "java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory"

   -j "java.naming.provider.url=ldap://mydomain.com:389/o=imq"

   -j "java.naming.security.principal=uid=homerSimpson,ou=People,o=imq"

   -j "java.naming.security.credentials=doh"

   -j "java.naming.security.authentication=simple"

   -t qf

   -o "imqReconnectAttempts=3"

使用指令檔

imqobjmgr 指令的 -i 選項,可讓您指定使用 Java 特性檔案語法的指令檔名稱,以表示所有或部分子指令子句。此功能對指定物件存放區屬性極為有用,尤其是在物件存放區屬性一般需要大量的鍵入操作,並有可能在多次呼叫 imqobjmgr 中執行時作用顯著。使用指令檔也可讓您避免超出指令行所允許的最大字元數。

程式碼範例 8-9 顯示物件管理員指令檔的一般語法。請注意,version 屬性不是指令行選項:這表示指令檔本身的版本 (不是Message Queue 產品的版本),且必須將值設定為 2.0

程式碼範例 8-9 物件管理員指令檔語法

version=2.0

cmdtype=[ add | delete | list | query | update ]

obj.lookupName=lookup name

objstore.attrs.objStoreAttrName1=value1

objstore.attrs.objStoreAttrName2=value2

   . . .

objstore.attrs.objStoreAttrNameN=valueN

obj.type=[ q | t | cf | qf | tf | xcf | xqf | xtf | e ]

obj.attrs.objAttrName1=value1

obj.attrs.objAttrName2=value2

   . . .

obj.attrs.objAttrNameN=valueN

例如,之前在程式碼範例 8-1 中所顯示的物件管理員指令,會將佇列連線工廠新增至 LDAP 物件存放區。此指令可以封裝在程式碼範例 8-10 中所示的指令檔中。若是指令檔命名為 MyCmdFile,您可以使用指令行執行指令

imqobjmgr -i MyCmdFile

程式碼範例 8-10 範例指令檔

version=2.0

cmdtype=add

obj.lookupName=cn=myQCF

objstore.attrs.java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory

objstore.attrs.java.naming.provider.url=ldap://mydomain.com:389/o=imq

objstore.attrs.java.naming.security.principal=\

                                       uid=homerSimpson,ou=People,o=imq

objstore.attrs.java.naming.security.credentials=doh

objstore.attrs.java.naming.security.authentication=simple

obj.type=qf

obj.attrs.imqAddressList=mq://myHost:7272/jms

指令檔也可以用來僅指定 imqobjmgr 子指令子句的一部分,剩下部分則由指令行明確提供。例如,程式碼範例 8-12 中所示的指令檔僅指定了 LDAP 物件存放區的屬性值。

程式碼範例 8-11 部分指令檔

version=2.0

objstore.attrs.java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory

objstore.attrs.java.naming.provider.url=ldap://mydomain.com:389/o=imq

objstore.attrs.java.naming.security.principal=\

                                       uid=homerSimpson,ou=People,o=imq

objstore.attrs.java.naming.security.credentials=doh

objstore.attrs.java.naming.security.authentication=simple

您可以接著使用此指令檔,以 imqobjmgr 指令來指定物件存放區,同時明確提供其餘選項,如程式碼範例 8-12 所示。

程式碼範例 8-12 使用部分指令檔  

imqobjmgr add

   -l "cn=myQCF"

   -i MyCmdFile

   -t qf

   -o "imqAddressList=mq://myHost:7272/jms"

根據您使用的平台,可於以下位置找到指令檔的其他範例︰



上一頁      目錄      索引      下一頁     


文件號碼:819-3562。  Copyright © 2005 Sun Microsystems, Inc. 版權所有。