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

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

第 8 章
管理受管理物件

使用受管理物件可允許對移植到其他 JMS 提供者的用戶端應用程式進行開發。受管理物件可封裝提供者特定的配置和命名資訊。

Message Queue 管理員通常會為用戶端應用程式建立受管理物件,使其能夠與代理程式建立連線。用戶端應用程式會使用連線來向實體目標傳送訊息並從實體目標接收訊息。

本章介紹如何使用物件管理員公用程式 (imqobjmgr) 以執行這些工作。因為這些工作涉及您使用的物件儲存與您建立的受管理物件之屬性理解,在描述如何使用 imqobjmgr 管理受管理物件前,本章會先提供這兩個主題的背景。

本章包含以下各節:


關於物件儲存

受管理物件放在即時可用的物件儲存中,用戶端應用程式可透過 JNDI 查找來存取此處的受管理物件。您可以使用兩種類型的物件儲存︰標準的 LDAP 目錄伺服器或檔案系統物件儲存。

LDAP 伺服器物件儲存

LDAP 伺服器是用於生產訊息傳送系統的建議物件儲存。LDAP 實作可從一些供應商處獲得,並設計為在分散式系統中使用。LDAP 伺服器也在生產環境中提供有利的安全性功能。

Message Queue 管理工具可管理 LDAP 伺服器上的物件儲存。然而,依 LDAP 伺服器文件規定,您可能必須先配置 LDAP 伺服器,以便儲存 Java 物件與執行 JNDI 查找。

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

檔案系統物件儲存

Message Queue 還支援檔案系統物件儲存實作。當檔案系統物件儲存未經過完全測試並因此不建議用於生產系統時,它的優點是易於在開發環境中使用。您所要做的是在您的本機檔案系統上建立目錄,而不是設定 LDAP 伺服器。

但是,檔案系統儲存不可作為部署在多重電腦節點之用戶端的集中物件儲存,除非這些用戶端可以存取物件儲存所在的目錄。除此之外,任何對此目錄擁有存取權的使用者均可使用 Message Queue 管理工具,以建立並管理受管理物件。

使用檔案系統物件儲存時,您必須指定表 8-2 中顯示的屬性。這些屬性分為以下幾個種類:


關於受管理物件屬性

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

Message Queue 提供兩種管理工具,用於建立和管理受管理物件:指令行物件管理員公用程式 (imqobjmgr) 和 GUI管理主控台。本章只描述如何使用指令行。

使用屬性值對指定的受管理物件的屬性。

連線工廠屬性

連線工廠的配置會傳送至所有由連線工廠建立作為用戶端應用程式的連線。連線已配置成定義傳送或接收訊息的一方,可指定用戶端執行階段如何處理訊息流量,並為經由連線傳送的全部訊息自動設定某些資訊。

有兩種連線工廠物件:

ConnectionFactoryXAConnectionFactory 物件共用同一組屬性。

連線工廠物件可由管理員或應用程式建立和配置 (以建立原型或測試為目的)。您可以使用 imqobjmgr 工具或管理主控台來設定連線工廠屬性。

本節描述以下各章節中的連線工廠屬性,這些章節是由屬性影響的運作方式所架構的。

與您有主要關係的屬性為 imqAddressList,它可用於指定用戶端將與其建立連線的代理程式。 新增連線工廠一節介紹當您將連線工廠受管理物件新增至您的物件儲存時,如何指定屬性。

如需連線工廠屬性的參照資訊,請參閱第 16 章「受管理物件屬性參照」和 Message Queue 類別 com.sun.messaging.ConnectionConfiguration 的 JavaDoc API 文件。

連線處理

您可使用連線處理的屬性來指定要連線的訊息伺服器位址,如果需要重新連線,則要指定嘗試重新連線的次數,以及連線嘗試之間的間隔時間。

用戶端所連線的訊息伺服器位址,是您指定為 imqAddressList 屬性的數值。訊息伺服器位址包含代理程式主機名稱、連接埠號和連線服務類型。

連接埠的編號可以是代理程式的連接埠對映器常駐的連接埠,或是特定連線服務常駐的連接埠。如果您指定了連接埠對映器的連接埠,連接埠對映器會動態指定連線用的連接埠。如需指定訊息伺服器位址的完整資訊,請參閱 imqAddressList 屬性值的語法

自動重新連線

在單一代理程式環境或多重代理程式叢集環境中,您可以設定當連線失敗時,讓用戶端能夠自動重新連線至代理程式的連線處理屬性。您也可以配置重新連線的程序。

重新連線功能可提供連線防故障備用,但不提供資料防故障備用:當用戶端自動重新連線至不同的代理程式實例時,失敗或斷線代理程式所保留的永久性訊息和其他狀態資訊將會遺失。

如果自動重新連線啟用的話,Message Queue 會在連線失敗時保留暫存目標,以防用戶端可能會重新連線和再次存取。在讓用戶端有時間進行重新連線並使用這些目標之後,代理程式將刪除這些目標。

處理重新連線的方法取決於用戶端連線至單一代理程式,或是連線至叢集一部分的代理程式。以下各節描述了各種可能性。

重新連線至單一代理程式     若要讓用戶端能在連線失敗時自動重新連線至代理程式,您必須設定以下的連線工廠屬性:

如需這些屬性的完整參照資訊,請參閱連線處理

重新連線至叢集中的代理程式     在多重代理程式叢集的環境中,如果您指定 imqAddressList 屬性的多重位址,將重複自動重新連線清單中的代理程式。清單中的所有代理程式都必須以 Message Queue Enterprise Edition 安裝。

如果用戶端連線至清單中的第一個位址時失敗,用戶端執行階段會嘗試重新連線至清單中的另一個代理程式。如果嘗試連線失敗,用戶端執行階段會繼續在清單中逐一連線,直到能夠重新連線至用戶端為止。

如果嘗試連線不成功,用戶端執行階段會以指定的次數在清單中循環連線,直到找到可用的代理程式或無法找到任何的代理程式為止。imqAddressListBehavior 屬性的設定會決定,是要依照位址清單中的順序選擇重新連線的代理程式,還是在清單中隨機選擇。

若要讓用戶端能重新連線至叢集中的代理程式,請使用以下的屬性:

如需這些屬性的完整參照資訊,請參閱連線處理

連線偵測

imqPingInterval 屬性可指定從用戶端執行階段到代理程式的偵測作業頻率。用戶端執行階段會不定期測試連線,以預先偵測到失敗的連線。如果偵測作業失敗,用戶端執行階段會拋出異常至用戶端應用程式的異常偵聽程式物件中。如果應用程式中沒有異常偵聽程式,則下一個使用連線的嘗試會失敗。

偵測功能對於那些等待接收訊息而無法傳送訊息的使用者用戶端應用程式來說,特別的重要。否則這些應用程式將無法得知連線何時會失敗。不定期產生訊息的用戶端也可因此功能而受惠,因為它可以在需要傳送訊息之前處理失敗的連線。

依預設,偵測間隔設定在 30 秒。-1 的值會停用偵測作業。

對於連線中斷的回應會根據特定的作業系統而有所差異。例如,在一些作業系統上,偵測會立即報告失敗的情況。其他的作業系統可能會繼續嘗試建立與代理程式的連線,緩衝連續的偵測,直到偵測成功或緩衝區溢位。

如需 imqPingInterval 屬性的完整參照資訊,請參閱連線處理

用戶端標識

Message Queue 會定義一組連線工廠屬性,以支援用戶端認證和唯一的用戶端 ID 設定,這是長期用戶所必需的。

嘗試連線至代理程式的用戶端必須經過認證。如果用戶端在建立連線時並未指定使用者名稱或密碼,會發生以下其中一種情況:

此方案可允許任何使用者取得連線,這對於開發與測試來說非常的方便。在生產系統中,僅限於已新增至使用者儲存庫的使用者才能存取連線。

除了請求連線的用戶端之代理程式認證以外,JMS 規格會需要在維護用戶端狀態時,該連線能提供唯一的用戶端識別碼。Message Queue 使用用戶端 ID 來記錄長期用戶。如果長期用戶成為非使用中的用戶,代理程式會保留該用戶的訊息,等到用戶恢復作用時再傳送這些訊息。代理程式會藉由用戶端 ID 來識別用戶。

您可以使用管理級別設定 ClientID,或者用戶端可有計劃地設定 ClientID。如果多重用戶端從相同的連線工廠取得連線,請為連線工廠設定 ClientID。Message Queue 將能為每個從該工廠取得的連線提供唯一的 ClientID。

若要確保 ClientID 為唯一的值,請使用以下的格式來設定 imqConfiguredClientID屬性:

imqConfiguredClientID=${u}string

${u} 必須為屬性值的前四個字元。如果不是出現 "u" 的字元,在建立連線時會發生 JMS 異常。

string 數值是您要與連線工廠所生產的連線發生關聯的數值,例如 Xconn。在使用者認證階段,Message Queue 會以 u:userName 替代 u例如,如果與連線有關聯的使用者為 Athena 而指定給連線的字串為 ${u}Xconn,則 ClientID 將為 u:AthenaXconn

此方案將可確保每個由連線工廠所產生的連線都將包含 ClientID。

有一種方案無法運作的情況:如果兩個用戶端使用如 guest 的預設使用者名稱來取得連線,則都會有相同 ${u} 元件的 ClientID。在執行階段中,第一個要求連線的用戶端可取得連線,第二個則不行,因為 MQ 無法以非唯一的 ClientID 來建立連線。

您可以設定 imqDisableSetClientID 屬性,以防止使用連線工廠的用戶端有計劃地變更已配置用戶端 ID。

您必須設定長期訂閱的 imqConfiguredClientID 屬性,除非應用程式使用的是 setClientId() 方法。

總而言之,這些就是影響用戶端識別的屬性:

如需這些屬性的完整參照資訊,請參閱用戶端標識

可靠性和流量控制

用戶端傳送和接收的訊息與 Message Queue 所使用的控制訊息,皆會忽略相同用戶端與代理程式間的連線。如果 JMS 訊息傳送阻擋控制訊息,則會造成控制訊息 (例如代理程式確認) 傳送的延遲。

您可以設定連線工廠屬性,讓您管理與用戶端訊息流量相關的控制訊息流量。控制這兩種訊息的流量涉及流量與可靠性之間的洩漏。如需如何使用這些屬性以管理流量控制與可靠性的說明,請參閱用戶端執行階段訊息流量調整

以下屬性會影響用戶端和控制訊息的流量:

如需這些屬性的完整參照資訊,請參閱穩定性與流量控制

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

這些屬性影響用戶端佇列瀏覽:

如需這些屬性的完整參照資訊,請參閱佇列瀏覽器運作方式和伺服器階段作業

JMS 定義的特性支援

您可以使用連線工廠屬性,在連線所產生的訊息上自動設定 JMS 定義的特性。JMS 特性是在 JMS 規格中所定義,位於 http://java.sun.com/products/jms/docs.html

使用以下屬性來設定 JMS 定義的特性:

如需這些屬性的完整參照資訊,請參閱 JMS 定義的特性支援

JMS 訊息標頭覆寫

您可以設定連線工廠的屬性,以覆寫指定訊息的永久性、使用期限和優先權的 JMS 訊息標頭欄位。此設定是用於從連線工廠取得的連線所生產之訊息。

可覆寫以下 JMS 欄位中的數值:

如需有關這些欄位的更多資訊,請參閱 http://java.sun.com/products/jms/docs.html 中的 JMS 規格。

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

下表包含了處理訊息覆寫的連線工廠屬性。大部分的屬性都是成對的。每對的第一個屬性可指定是否能覆寫已指定的標頭欄位,第二個屬性則指定覆寫值。

如需這些屬性的完整參照資訊,請參閱訊息標頭覆寫

目標受管理物件屬性

目標受管理物件識別實體主題或佇列目標,其具有表 16-1 中列出的屬性。新增主題佇列一節介紹當您將目標受管理物件新增至您的物件儲存時,如何指定這些屬性。

與您有主要關係的屬性為 imqDestinationName。這是您指定給符合主題或佇列受管理物件的實體目標的名稱。您還可以提供目標描述,這會幫助您將此目標與您可能建立以支援許多應用程式的其他目標區分開來。

如需更多資訊,請參閱用於 Message Queue 類別 com.sun.messaging.DestinationConfiguration 的 JavaDoc API 文件。


使用物件管理員公用程式 (imqobjmgr)

物件管理員公用程式可讓您建立並管理 Message Queue 受管理物件。使用此公用程式,您可以執行以下工作:

如需 imqobjmgr 指令的語法、子指令和選項的詳細資訊,請參閱第 13 章「指令參照」。下節描述使用任何 imqobjmgr 子指令時需要提供的資訊。

需要的資訊

當執行與受管理物件相關的大部分工作時,您必須將以下資訊指定為 imqobjmgr 子指令的選項:

使用指令檔

imqobjmgr 指令可讓您指定使用 Java 特性檔案語法的指令檔的名稱,以表示所有或部分 imqobjmgr 子指令子句。

將指令檔與物件管理員公用程式 (imqobjmgr) 配合使用,對指定物件儲存屬性極為有用,這可能與跨 imqobjmgr 的多重呼叫一樣,並且一般需要大量的鍵入。使用指令檔還可讓您避免鍵入可能超出指令行所允許的最大字元數的情況。

imqobjmgr 指令檔的一般語法如下 (版本特性會反映指令檔版本,但不會反映 Message Queue 產品的版本 - 不是指令行選項 - 它的值必須設定成 2.0):

 

version=2.0

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

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

obj.lookupName=lookup name

obj.attrs.objAttrName1=value1

obj.attrs.objAttrName2=value2

obj.attrs.objAttrNameN=valueN



objstore.attrs.objStoreAttrName1=value1

objstore.attrs.objStoreAttrName2=value2

objstore.attrs.objStoreAttrNameN=valueN



 

作為如何使用指令檔的範例,請考量以下 imqobjmgr 指令:

 

imqobjmgr add

       -t qf

       -l "cn=myQCF"

        -o "imqAddressList=mq://foo:777/jms"

       -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=fooUser, ou=People, o=imq"

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

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

 

此指令可封裝在檔案 (如 MyCmdFile) 中,此檔案具有以下內容:

 

    version=2.0

    cmdtype=add

    obj.type=qf

    obj.lookupName=cn=myQCF

    obj.attrs.imqAddressList=mq://foo:777/jms

    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=fooUser, ou=People, o=imq

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

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

 

然後,您可以使用 -i 選項將此檔案傳送至物件管理員公用程式 (imqobjmgr):

imqobjmgr -i MyCmdFile

您還可以使用指令檔指定某些選項,同時使用指令行指定其他選項。這可讓您使用指令檔指定部分子指令子句,這與跨公用程式的許多呼叫一樣。例如,以下指令指定新增連線工廠受管理物件所需的所有選項 (指定要在何處儲存受管理物件的那些選項除外)。

 

imqobjmgr add

       -t qf

      -l "cn=myQCF"

       -o "imqAddressList=mq://foo:777/jms"

       -i MyCmdFile

 

在此例中,檔案 MyCmdFile 將包含以下定義:

 

    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=fooUser, ou=People, o=imq

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

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

 

指令檔的其他範例可在以下位置找到︰


新增和刪除受管理物件

本節介紹如何將連線工廠和主題或佇列目標的受管理物件新增至物件儲存。


備註

物件管理員公用程式 (imqobjmgr) 僅列出並顯示 Message Queue 受管理物件。如果物件儲存應包含的非 Message Queue 物件與您想新增的受管理物件具有相同的查找名稱,那麼當您嘗試新增作業時會出現錯誤。


新增連線工廠

若要啟用用戶端應用程式以便與代理程式建立連線,您需要新增表示用戶端應用程式所需連線類型的受管理物件:主題連線工廠或佇列連線工廠

若要新增佇列連線工廠,請使用以下指令:

 

imqobjmgr add

-t qf

-l "cn=myQCF"

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

-j "java.naming.factoryinitial=

com.sun.jndi.ldap.LdapCtxFactory"

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

-j "java.naming.security.principal=

uid=fooUser, ou=People, o=imq"

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

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

 

上述指令建立查找名稱為 cn=myQCF 的受管理物件,此物件將連線至在 myHost 上執行的代理程式,並偵聽連接埠 7272。受管理物件儲存在 LDAP 伺服器中。您可以透過將指令檔指定為 imqobjmgr 指令的引數來完成相同的作業。如需更多資訊,請參閱使用指令檔


備註

命名慣例:如果您要使用 LDAP 伺服器儲存受管理物件,則指定字首為「cn=」的查找名稱很重要 (如上述範例所示:cn=myQCF)。您可以使用 -l 選項指定查找名稱。如果您正在使用檔案系統物件儲存,那麼您不需使用 cn 字首,但請勿使用包含「/」的查找名稱。請參閱表 8-3


表 8-3 命名慣例範例

物件儲存類型

正確名稱

錯誤名稱

LDAP 伺服器

cn=myQCF

myQCF

檔案系統

myTopic

myObjects/myTopic

新增主題佇列

若要啟用用戶端應用程式以存取代理程式上的實體目標,您需要將可識別這些目標的受管理物件新增至物件儲存。

在將相應的受管理物件新增至物件儲存前,最好先建立實體目標。使用指令公用程式 (imqcmd) 以在代理程式上建立實體目標,這些實體目標可由物件儲存中的目標受管理物件識別。如需有關建立實體目標的資訊,請參閱取得有關連線的資訊

以下指令新增可識別主題目標的受管理物件,此主題目標的查找名稱為 myTopic,實體目標名稱為 TestTopic。受管理物件儲存在 LDAP 伺服器中。

 

    imqobjmgr add

    -t t

    -l "cn=myTopic"

    -o "imqDestinationName=TestTopic"

    -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=fooUser, ou=People, o=imq"

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

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

 

這是相同的指令,只是受管理物件儲存在 Solaris 檔案系統中:

 

imqobjmgr add

      -t t

      -l "cn=myTopic"

      -o "imqDestinationName=TestTopic"

      -j "java.naming.factory.initial=

com.sun.jndi.fscontext.RefFSContextFactory"

      -j "java.naming.provider.url=

file:///home/foo/imq_admin_objects"

 

例如,在 LDAP 伺服器一例中,您可以使用指令檔 MyCmdFile 以指定子指令子句。此檔案將包含以下文字:

 

    version=2.0

    cmdtype=add

    obj.type=t

    obj.lookupName=cn=myTopic

    obj.attrs.imqDestinationName=TestTopic

    objstore.attrs.java.naming.factory.initial=

com.sun.jndi.fscontext.RefFSContextFactory

    objstore.attrs.java.naming.provider.url=

file:///home/foo/imq_admin_objects

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

uid=fooUser, ou=People, o=imq

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

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

 

使用 -i 選項將檔案傳送至 imqobjmgr 指令:

imqobjmgr -i MyCmdFile


備註

如果您要使用 LDAP 伺服器儲存受管理物件,則指定字首為「cn=」的查找名稱很重要 (如上述範例所示)。您可以使用 -l 選項指定查找名稱。如果您要使用檔案系統物件儲存,則無需使用此字首。


除了為 -t 選項指定 q,新增佇列物件的方法完全相同。

刪除受管理物件

使用 delete 子指令以刪除受管理物件。您必須指定物件的查找名稱、類型和位置。

以下指令刪除某主題的受管理物件,此主題的查找名稱為 cn=myTopic,並儲存在 LDAP 伺服器上。

 

imqobjmgr delete

    -t t

    -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=fooUser, ou=People, o=imq"

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

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

 


列出受管理物件

使用 list 子指令以取得所有受管理物件的清單,或取得特定類型的所有受管理物件的清單。以下範例程式碼假設受管理物件儲存在 LDAP 伺服器中。

以下指令列出所有物件。

 

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=fooUser, ou=People, o=imq"

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

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

 

以下指令列出類型 queue 的所有物件。

 

imqobjmgr list

-t q

-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=fooUser, ou=People, o=imq"

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

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

 


取得有關單一物件的資訊

使用 query 子指令,以取得有關受管理物件的資訊。您必須指定物件的查找名稱和包含受管理物件的物件儲存的屬性 (如初始環境和位置)。

在以下範例中,query 子指令用來顯示有關查找名稱為 cn=myTopic 之物件的資訊。

 

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=fooUser, ou=People, o=imq"

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

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

 


更新受管理物件

您可以使用 update 指令修改受管理物件的屬性。您必須指定物件的查找名稱和位置。您可以使用 -o 選項修改屬性值。

此指令變更表示主題連線工廠受管理物件的屬性:

 

imqobjmgr update

-t tf

-l "cn=MyTCF"

-o imqReconnectAttempts=3

-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=fooUser, ou=People, o=imq"

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

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

 



上一頁      目錄      索引      下一頁     


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