Sun Java System Application Server 9.1 管理指南

第 4 章 配置 Java 訊息服務資源

Application Server 透過將 Sun Java System Message Queue (原來稱為 Sun ONE Message Queue) 軟體整合到 Application Server 中,實作了 Java 訊息服務 (JMS) API。對於基本的 JMS API 管理作業,請使用 Application Server 管理主控台。對於進階作業 (包括管理訊息佇列叢集),請使用 MQ-as-install /imq/bin 目錄中提供的工具。如需有關管理 Message Queue 的詳細資訊,請參閱「Message Queue Administration Guide」。

本章描述如何為使用 Java 訊息服務 (JMS) API 的應用程式配置資源。它包含以下小節:

JMS 資源

Java 訊息服務 (JMS) API 使用兩種管理物件:

這些物件是以管理方式建立的,而建立物件的方式則特定於每個 JMS 實作。在 Application Server 中執行以下作業:

JMS 應用程式使用 JNDI API 來存取連線工廠和目標資源。通常,JMS 應用程式至少使用一個連線工廠和一個目標。若要瞭解應建立的資源,請研究應用程式或向應用程式開發者洽詢。

連線工廠分為三種類型:

有兩種類型的目標:

Java EE 5 教學課程」中有關 JMS 的章節提供了有關此兩類通訊和 JMS 其他方面的詳細資訊 (請參閱 http://java.sun.com/javaee/5/docs/tutorial/doc/index.html)。

建立資源的次序並不重要。

對於 J2EE 應用程式,請在 Application Server 部署描述元中指定連線工廠和目標資源,如下所示:

JMS 資源和連接器資源的關係

Application Server 透過使用名為 jmsra 的系統資源配接卡實作 JMS。使用者建立 JMS 資源時,Application Server會自動建立連接器資源,這些連接器資源將顯示在管理主控台樹狀結構檢視的 [連接器] 節點下。

對於使用者建立的每個 JMS 連線工廠,Application Server 均會建立連接器連線池和連接器資源。對於使用者建立的每個 JMS 目標,Application Server 均會建立管理物件資源。使用者刪除 JMS 資源時,Application Server 會自動刪除連接器資源。

您可以使用管理主控台的 [連接器] 節點 (而非 [JMS 資源] 節點) 為 JMS 系統資源配接卡建立連接器資源。請參閱第 7 章, 連接器資源,以取得詳細資訊。

JMS 連線工廠

JMS 連線工廠為允許應用程式以程式化方式建立其他 JMS 物件的物件。這些受管理物件會實作 ConnectionFactoryQueueConnectionFactoryTopicConnectionFactory 介面。您可以使用 Application Server 管理主控台來建立、編輯或刪除 JMS 連線工廠。建立新的 JMS 連線工廠時,會同時建立該工廠的連接器連線池及連接器資源。

若要使用指令行公用程式管理 JMS 連線工廠,請使用 create-jms-resourcelist-jms-resourcesdelete-jms-resource 指令。

JMS 目標資源

JMS 目標可做為訊息的儲存庫。您可以使用管理主控台來建立、修改或刪除 JMS 目標資源。若要建立新的 JMS 目標資源,請選取 [資源] > [JMS 資源] > [目標資源]。您可以在 [目標資源] 頁面上,指定以下內容:

若要使用指令行公用程式管理 JMS 目標,請使用 create-jms-resourcedelete-jms-resource 指令。


提示 –

若要指定 asadmin create-jms-resource 指令的 addresslist 特性 (格式為 host:mqport,host2:mqport,host3:mqport),請使用 \\ 退出「:」。例如,host1\\:mqport,host2\\:mqport,host3\\:mpqport

如需有關使用退出字元的更多資訊,請參閱「asadmin(8) 線上手冊」。


JMS 實體目標

若要進行生產,務必建立實體目標。但是,在開發和測試期間,不需要執行此步驟。應用程式首次存取目標資源時,Message Queue 會自動建立目標資源的 Name 特性指定的實體目標。該實體目標是暫時的,並且將在 Message Queue 配置特性指定的時間段後過期。

若要從管理主控台建立實體目標,請選取 [配置] > [實體目標]。在 [建立實體目標] 頁面上,指定實體目標的名稱並選擇目標類型,此類型可以是主題或佇列。如需有關 [實體目標] 頁面上的欄位和特性的詳細資訊,請參閱管理主控台線上說明。

若要進行生產,務必建立實體目標。但是,在開發和測試期間,不需要執行此步驟。應用程式首次存取目標資源時,Message Queue 會自動建立目標資源的 Name 特性指定的實體目標。該實體目標是暫時的,並且將在 Message Queue 配置特性指定的時間段後過期。

若要使用指令行公用程式來管理 JMS 實體目標,請使用 create-jmsdestflush-jmsdestdelete-jmsdest 指令。

配置 JMS 提供者特性

使用管理主控台的 [JMS 服務] 頁面配置所有 JMS 連線都將使用的特性。在管理主控台中,選取 [配置] > [Java 訊息服務]。在 [JMS 服務] 頁面上,您可以控制下列一般 JMS 設定。

所有這些特性的值也都能在執行階段更新。不過,只有在更新特性後所建立的連線工廠才會取得更新過的值。現有的連線工廠將繼續保有原來的特性值。另外,要讓絕大部份的值生效,必須重新啟動 Application Server。預設的 JMS 主機是唯一無須重新啟動 Application Server 就能更新的特性。

若要使用指令行公用程式來管理 JMS 提供者,請使用 set 或 jms-ping 指令。

存取遠端伺服器

將提供者和主機變更為遠端系統會使所有 JMS 應用程式都在遠端伺服器上執行。若要在使用本機伺服器的同時使用一個或多個遠端伺服器,請使用 AddressList 特性建立連線工廠資源從而建立存取遠端伺服器的連線。

外來的 JMS 提供者

Generic Resource Adapter 1.5 for JMS 為 Java EE Connector 1.5 資源配接卡,可包裝外部 JMS 提供者 (例如 IBM Websphere MQ、Tibco EMS、Sonic MQ 等) 的 JMS 用戶端程式庫,因此可將任何 JMS 提供者與 Java EE 1.4 Application Server (例如 Sun Java System Application Server) 整合。該配接卡是 .rar 歸檔,可藉由 Java EE 1.4 Application Server 的管理工具加以部署和配置。

配置 JMS 的通用資源配接卡

Application Server 的管理工具可用來部署和配置 JMS 的通用資源配接卡。本節說明如何以 Sun Java System Application Server 來配置 JMS 的通用資源配接卡。

整體而言,可對資源配接卡進行配置以顯示 JMS 提供者是否支援 XA。另外也能指出可以用何種可能的模式與 JMS 提供者進行整合。資源配接卡支援兩種整合模式。第一種模式是以 JNDI 做為整合方式。在此情況下,受管理物件是在 JMS 提供者的 JNDI 樹狀結構中設定,並由通用資源配接卡進行查找以供使用。如果該模式並不適合用於整合,還可以使用 JMS 管理物件 javabean 類別的 Java 反射做為整合模式。

您可以使用管理主控台或指令行配置資源配接卡。方法和配置其他資源配接卡均相同。

配置通用資源配接卡

部署資源配接卡之前,Application Server 應該能夠使用 JMS 用戶端程式庫。對某些 JMS 提供者而言,用戶端程式庫也能同時包含本機程式庫。在這種情況下,Application Server JVM 也應能夠使用這些原生程式庫。

  1. 以部署連接器模組的方式來部署通用資源配接卡。

  2. 建立連接器連線池

  3. 建立連接器資源。

  4. 建立管理物件資源。

  5. 在 Application Server 中,對安全性策略進行以下變更:

    • 修改 sjsas_home/domains/domain1/config/server.policy 以增加 java.util.logging.LoggingPermission "control"

    • 修改 sjsas_home/lib/appclient/client.policy 以增加 permission javax.security.auth.PrivateCredentialPermission "javax.resource.spi.security.PasswordCredential ^ \"^\"","read":

資源配接卡特性

下表列出在建立資源配接卡時會用到的特性。

特性名稱

有效值

預設值

說明

ProviderIntegrationMode

javabean/jndi

javabean

決定資源配接卡和 JMS 用戶端之間的整合模式。 

ConnectionFactoryClassName

Application Server 類別路徑中可供使用的類別名稱,例如: 

com.sun.messaging.ConnectionFactory

無 

JMS 用戶端的 javax.jms.ConnectionFactory 實作的類別名稱。只有當 ProviderIntegrationModejavabean 時才使用。

QueueConnectionFactoryClassName

Application Server 類別路徑中可供使用的類別名稱,例如: 

com.sun.messaging.QueueConnectionFactory

無 

JMS 用戶端的 javax.jms.QueueConnectionFactory 實作的類別名稱。只有當 ProviderIntegrationModejavabean 時才使用。

TopicConnectionFactoryClassName

Application Server 類別路徑中可供使用的類別名稱,例如: 

com.sun.messaging.TopicConnectionFactory

無 

JMS 用戶端的 javax.jms.TopicConnectionFactory 實作的類別名稱。只有將 ProviderIntegrationMode 指定為 javabean 時才使用。

XAConnectionFactoryClassName

Application Server 類別路徑中可供使用的類別名稱,例如: 

com.sun.messaging.XAConnectionFactory

無 

JMS 用戶端的 javax.jms.ConnectionFactory 實作的類別名稱。只有將 ProviderIntegrationMode 指定為 javabean 時才使用。

XAQueueConnectionFactoryClassName

Application Server 類別路徑中可供使用的類別名稱,例如: 

com.sun.messaging.XAQueueConnectionFactory

無 

JMS 用戶端的 javax.jms.XAQueueConnectionFactory 實作的類別名稱。只有將 ProviderIntegrationMode 指定為 javabean 時才使用。

XATopicConnectionFactoryClassName

Application Server 類別路徑中可供使用的類別名稱,例如: 

com.sun.messaging.XATopicConnectionFactory

無 

JMS 用戶端的 javax.jms.XATopicConnectionFactory 實作的類別名稱。只有當 ProviderIntegrationModejavabean 時才使用。

TopicClassName

Application Server 類別路徑中可供使用的類別名稱,例如: 

com.sun.messaging.Topic

無 

JMS 用戶端的 javax.jms.Topic 實作的類別名稱。只有當 ProviderIntegrationModejavabean 時才使用。

QueueClassName

應用程式伺服器類別路徑中可供使用的類別名稱,例如: 

com.sun.messaging.Queue

無 

JMS 用戶端的 javax.jms.Queue 實作的類別名稱。只有將 ProviderIntegrationMode 指定為 javabean 時才使用。

SupportsXA

True/false

FALSE

指定 JMS 用戶端是否支援 XA。 

ConnectionFactoryProperties

以逗號分隔的「名稱-值」對 

無 

指定 JMS 用戶端的 javabean 特性名稱以及 ConnectionFactory 的值。只有當 ProviderIntegrationModejavabean 時才需要。

JndiProperties

以逗號分隔的「名稱-值」對 

無 

指定用來連線至 JMS 提供者之 JNDI 的 JNDI 提供者特性。只有當 ProviderIntegrationModejndi 時才使用。

CommonSetterMethodName

方法名稱 

無 

指定某些 JMS 供應商在設定其受管理物件的特性時,所使用的一般 setter 方法名稱。只有當 ProviderIntegrationModejavabean 時才使用。如果是 Sun Java System Message Queue,則此特性稱為 setProperty

UserName

JMS 使用者名稱 

無 

與 JMS 提供者連線時採用的使用者名稱。 

Password

JMS 使用者的密碼 

無 

與 JMS 提供者連線時採用的密碼。 

RMPolicy

ProviderManagedOnePerPhysicalConnection

ProviderManaged

作業事件管理員使用 XAResource 上的 isSameRM 方法,判斷由兩個 XAResources 所呈現的資源管理員實例是否相同。當 RMPolicy 設定為 ProviderManaged (預設值) 時,由 JMS 提供者負責決定 RMPolicy,通用資源配接卡中的 XAResource 包裝程式僅將 isSameRM 呼叫委託給訊息佇列提供者的 XA 資源實作。這應該非常適用於大部份的訊息佇列產品。

一些 XAResource 實作 (例如 IBM MQ 系列) 的每個實體連線都必須有一個資源管理員,因此在單一作業事件中,如果由相同的佇列管理員進行內送和外送通訊時,則可能會發生問題。當 RMPolicy 設定為 OnePerPhysicalConnection 時,通用資源配接卡中 XAResource 包裝程式實作的 isSameRM 會在委託至包裝物件前,檢查這兩個 XAResource 是否使用相同的實體連線。

ManagedConnectionFactory 特性

ManagedConnectionFactory 特性是在建立 connector-connection-pool 時所指定。建立資源配接卡時指定的所有特性,都可在 ManagedConnectionFactory 中遭到置換。其他僅由 ManagedConnectionFactory 提供的特性如下所示。

特性名稱

有效值

預設值

說明

ClientId

有效的用戶端 ID 

無 

由 JMS 1.1 規格所指定的 ClientID

ConnectionFactoryJndiName

JNDI 名稱 

無 

連線工廠的 JNDI 名稱,而此連線工廠連結於 JMS 提供者的 JNDI 樹狀結構。 管理員應提供 JMS 提供者本身的所有連線工廠特性 (除了 clientID 之外)。只有當 ProviderIntegratinModejndi 時,才使用此特性名稱。

ConnectionValidationEnabled

true/false 

FALSE 

若設定為 true,資源配接卡會使用異常偵聽程式來擷取任何連線異常,並將 CONNECTION_ERROR_OCCURED 事件傳送至 Application Server。

受管理物件資源特性

本小節所說明的特性會在建立受管理物件資源時指定。所有資源配接卡特性都可在受管理資源物件中置換。其他只有管理物件資源才可提供的特性如下所示。

特性名稱

有效值

預設值

說明

DestinationJndiName

JNDI 名稱 

無 

目標的 JNDI 名稱,而此目標連結於 JMS 提供者的 JNDI 樹狀結構。 管理員應提供 JMS 提供者本身的所有特性。只有當 ProviderIntegrationModejndi 時,才使用此特性名稱。

DestinationProperties

以逗號分隔的「名稱-值」對 

無 

指定 JMS 用戶端的 javabean 特性名稱以及目標值。只有當 ProviderIntegrationModejavabean 時才需要。

啟動規格特性

本小節所述的特性在 MDB 的 Sun 特定部署描述元中,被指定為 activation-config-properties。所有資源配接卡特性都可在 Activation Spec 中置換。其他只有 ActivationSpec 才可提供的特性如下所示。

特性名稱

有效值

預設值

說明

MaxPoolSize

整數 

資源配接卡為同步傳遞訊息,可在內部建立的伺服器階段作業池最大大小。這必須等於 MDB 物件最大的池大小。 

MaxWaitTime

整數 

資源配接卡自其內部池取得伺服器階段作業時,會等候此特性所指定的秒數。如果超過此限制,訊息傳遞就會失敗。 

SubscriptionDurability

長期或非長期 

非長期 

由 JMS 1.1 規格所指定的 SubscriptionDurability

SubscriptionName

 

無 

由 JMS 1.1 規格所指定的 SubscriptionName

MessageSelector

有效的訊息選擇器 

無 

由 JMS 1.1 規格所指定的 MessageSelector

ClientID

有效的用戶端 ID 

無 

由 JMS 1.1 規格所指定的 ClientID

ConnectionFactoryJndiName

有效的 JNDI 名稱 

無 

在 JMS 提供者中建立的連線工廠 JNDI 名稱。資源配接卡會使用此連線工廠來建立連線,以接收訊息。只有將 ProviderIntegrationMode 配置為 jndi 時才使用。

DestinationJndiName

有效的 JNDI 名稱 

無 

在 JMS 提供者中建立的目標 JNDI 名稱。資源配接卡會使用此目標來建立連線,以接收訊息。只有將 ProviderIntegrationMode 配置為 jndi 時才使用。

DestinationType

javax.jms.Queuejavax.jms.Topic

Null 

MDB 會偵聽的目標類型。 

DestinationProperties

以逗號分隔的「名稱-值」對 

無 

指定 JMS 用戶端的 javabean 特性名稱以及目標值。只有當 ProviderIntegrationModejavabean 時才需要。

RedeliveryAttempts

整數 

 

當訊息在 MDB 中造成執行階段異常時,訊息要傳遞的次數。 

RedeliveryInterval

時間 (以秒為單位) 

 

當訊息在 MDB 中造成執行階段異常時,重複傳遞的間隔。 

SendBadMessagesToDMD

true/false 

False 

指出在超過嘗試傳遞的次數上限時,資源配接卡是否應傳送訊息至停用的訊息目標。 

DeadMessageDestinationJndiName

有效的 JNDI 名稱。 

無 

在 JMS 提供者中建立的目標 JNDI 名稱。這是已停用訊息之標的目標。只有當 ProviderIntegrationModejndi 時才使用。

DeadMessageDestinationClassName

目標物件的類別名稱。 

無 

只有當 ProviderIntegrationModejavabean 時才使用。

DeadMessageDestinationProperties

以逗號分隔的「名稱-值」對 

無 

指定 JMS 用戶端的 javabean 特性名稱以及目標值。只有當 ProviderIntegrationModejavabean 時才需要。

ReconnectAttempts

整數 

 

當異常偵聽程式擷取到連線錯誤時,嘗試重新連線的次數。 

ReconnectInterval

時間 (以秒為單位) 

 

重新連線的時間間隔。