Sun Java System Message Queue 3.7 UR1 技術摘要

程式設計物件

以下用於實作 JMS 訊息傳送的物件,在各程式設計網域間基本上都能保持相同:連線工廠、連線、階段作業、產生器、用戶、訊息與目標。圖 2–5 是這些物件的示意圖。此圖將從連線工廠物件開始,完整說明物件導出的方式。

連線工廠物件與目標物件會顯示在物件存放區中。強調這些物件通常會被視為受管理物件而進行建立、配置及管理。假設本章中的連線工廠與目標皆是利用管理方式建立 (而不是利用程式設計所建立)。

圖 2–5 JMS 程式設計物件

附圖所示是連線工廠、連線、階段作業、產生器、用戶、訊息與目標等物件之間的關係。下圖將以文字說明。

表 2–2 總結了傳送與接收訊息時的必要步驟。請注意,傳送者與接收者的步驟 1 至步驟 6 皆相同。

表 2–2 產生與使用訊息

產生訊息 

使用訊息 

1. 管理員建立連線工廠受管理物件。

2. 管理員建立實體目標與參照此目標的受管理物件。

3. 用戶端透過 JNDI 查找而取得連線工廠物件。

4. 用戶端透過 JNDI 查找而取得目標物件。

5. 用戶端建立連線,並設定此連線專有的特性。

6. 用戶端建立階段作業,並設定負責控制訊息傳送可靠性的特性。

7. 用戶端建立訊息產生器。 

用戶端建立訊息用戶。 

8. 用戶端建立訊息。 

用戶端啟動連線。 

9. 用戶端傳送訊息。 

用戶端接收訊息。 

下列幾節將說明產生器與用戶所使用的物件:連線、階段作業、訊息與目標。我們將藉由描述訊息的產生與使用,來結束對 JMS 物件的討論。

連線工廠與連線

用戶端會使用連線工廠物件 (ConnectionFactory) 建立連線。連線物件 (Connection) 代表用戶端與代理程式之間使用中的連線。它會使用依預設啟動的基本連線服務,或使用管理員為該用戶端專門啟動的基本連線服務。

通訊資源的分配以及用戶端的認證均在建立連接時進行。相對而言,這是一個十分重要的物件,大多數用戶端均使用單一連線來進行所有的訊息傳送。連線可支援同時使用:多個產生器與用戶共用相同的連線,而無數量上的限制。

建立連線工廠時,藉由設定其特性,可以對所有源自此連線工廠的連線配置其運作方式。對於 Message Queue,這些特性會指定下列資訊:

您可以從指令行置換連線工廠特性,以啟動用戶端應用程式。您也可以透過設定連線特性,而置換任何指定連線的特性。

您可以使用連線物件來建立階段作業物件、設定異常偵聽程式,或取得 JMS 的版本與提供者資訊。

階段作業

若連線代表用戶端與代理程式之間的通訊通道,則階段作業便代表用戶端與代理程式之間的單次對話。階段作業物件主要用於建立訊息、訊息產生器與訊息用戶。建立階段作業時,必須透過多個確認選項或透過作業事件來配置可靠的傳送作業。如需更多資訊,請參閱可靠的訊息傳送

根據 JMS 規格,階段作業是用來產生及使用訊息的單執行緒環境。您可以為單一階段作業建立多個訊息產生器與用戶;但若要連續加以使用,則會受到限制。Java 用戶端與 C 用戶端的執行緒在實作上略有不同。如需執行緒實作與限制的相關資訊,請參閱適當的開發者指南。

您也可以使用階段作業物件來執行下列作業:

訊息

訊息由下列 3 個部分組成:標頭、特性和內文。您必須瞭解此結構,才能編寫正確的訊息,並且配置特定的訊息傳送運作方式。

訊息標頭

每個 JMS 訊息都需要標頭。標頭含有 10 個預先定義的欄位,列出在表 2–3 中加以說明。

表 2–3 JMS 定義的訊息標頭

標頭欄位 

說明 

JMSDestination

指定訊息傳送所至之目標物件的名稱。(由提供者設定。)

JMSDeliveryMode

指定訊息是否具有永久性。(預設是由提供者所設定,或由產生器或個別訊息的用戶端明確設定。)

JMSExpiration

指定訊息的過期時間。(預設是由提供者所設定,或由產生器或個別訊息的用戶端設定。)

JMSPriority

指定介於 0 (低) 至 9 (高) 之間的訊息優先權。(預設是由提供者所設定,或由產生器或個別訊息的用戶端明確設定。)

JMSMessageID

指定提供者安裝環境內之訊息的唯一 ID。(由提供者設定。)

JMSTimestamp

指定提供者接收訊息的時間。(由提供者設定。)

JMSCorrelationID

供用戶端定義兩訊息間一致性的值。(必要時由用戶端設定。)

JMSReplyTo

指定用戶傳送回覆所至的目標。(必要時由用戶端設定。)

JMSType

可由訊息選擇器評估的值。(必要時由用戶端設定。)

JMSRedelivered

指定訊息是否已傳送但尚未確認。(由提供者設定。)

如您在閱讀此表格時所見,訊息標頭欄位具有多種用途:識別訊息、配置訊息路由、提供訊息處理的相關資訊等。

JMSDeliveryMode 是最重要的欄位之一,可決定訊息傳送的可靠性。此欄位可指出訊息是否具有永久性。

某些訊息標頭欄位是由提供者 (代理程式或用戶端執行階段) 設定,某些則是由用戶端設定。訊息產生器必須配置標頭值,才能取得特定的訊息傳送運作方式;而訊息用戶則必須讀取欄位值,才能夠瞭解路由訊息的方式,以及訊息可能需要的進一步處理。

標頭欄位 (JMSDeliveryModeJMSExpirationJMSPriority) 可設定為三種不同的層級:

如果這些欄位不只設在一個層級上,則連線工廠的設定值便會置換個別訊息的設定值;特定訊息的設定值則會置換訊息產生器的設定值。

訊息標頭欄位的常數名稱則會隨所用語言而有所不同。如需更多資訊,請參閱「Sun Java System Message Queue 3.7 UR1 Developer’s Guide for Java Clients」「Sun Java System Message Queue 3.7 UR1 Developer’s Guide for C Clients」

訊息特性

訊息中也可能含有可選的標頭欄位 (稱為特性),會以特性名稱與特性值成對指定。「特性」可讓用戶端與提供者延伸訊息標頭,並可包含任何有助於用戶端或提供者識別及處理訊息的資訊。訊息特性可讓接收用戶端要求僅傳送符合指定準則的訊息。例如,使用用戶端可指定只需要紐澤西州之兼差員工的薪資訊息。提供者將不會傳送任何不符指定準則的訊息。

JMS 規格定義九種標準特性。這些特性部分是由用戶端設定,部分則是由提供者設定。其名稱會以保留字元「JMSX」為開頭。用戶端或提供者可使用這些特性來判斷訊息的傳送者、訊息狀態,以及傳送訊息的頻率與時間。這些特性對提供者在路由訊息及提供診斷資訊時非常有用。

Message Queue 也可定義訊息特性,以識別壓縮訊息及訊息無法傳送時的處理方式。如需更多資訊,請參閱「Sun Java System Message Queue 3.7 UR1 Developer’s Guide for Java Clients」中的「Managing Message Size」

訊息內文

訊息內文中含有用戶端所要交換的資料。

JMS 訊息的類型決定內文所要包含的項目,以及用戶應以何種方式進行處理,如表 2–4 所指定。階段作業物件中包含各種訊息內文類型的建立方法。

表 2–4 訊息內文類型

類型 

說明 

StreamMessage

內文包含一連串 Java 原始值串流的訊息。它被依序寫入及讀取。 

MapMessage

內文包含一組「名稱-值」對的訊息。項目的順序未加以定義。 

TextMessage

內文包含 Java 字串的訊息,例如 XML 訊息。 

ObjectMessage

內文包含串列化 Java 物件的訊息。 

BytesMessage

內文包含未解譯位元組串流的訊息。 

Message

包含標頭和特性,但沒有內文的訊息。 

Java 用戶端可設定特性,讓用戶端執行階段壓縮所要傳送的訊息內文。位於用戶端上的 Message Queue 執行階段可在傳送前解壓縮訊息。