Sun Java System Application Server Enterprise Edition 8.2 管理指南

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

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

關於 JMS 資源

Application Server 中的 JMS 提供者

Application Server 透過將 Sun Java System Message Queue (原來稱為 Sun ONE Message Queue) 軟體整合到 Application Server 中,實作了 Java 訊息服務 (JMS) API。對於基本的 JMS API 管理作業,請使用 Application Server Administration Console。對於進階作業 (包括管理 Message Queue 叢集),請使用 MQ-install-dir/imq/bin 目錄中提供的工具。

如需有關管理 Message Queue 的詳細資訊,請參閱「Message Queue Administration Guide」。

JMS 資源

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

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

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

連線工廠分為三種類型:

有兩種類型的目標:

J2EE 1.4 Tutorial」中有關 JMS 的章節提供了有關此兩種通訊和 JMS 其他方面的詳細資訊 (請參閱 http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html)。

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

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

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

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

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

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

JMS 連線工廠

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

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

JMS 目標資源

JMS 目標可做為訊息的儲存庫。您可以使用 Admin Console 來建立、修改或刪除 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 配置特性指定的時間段後過期。

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

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

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

JMS 提供者

配置 JMS 提供者的一般特性

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

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

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

存取遠端伺服器

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

外來的 JMS 提供者

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

配置 JMS 的通用資源配接卡

應用程式伺服器的管理工具可用來部署和配置 JMS 的通用資源配接卡。本節說明如何以 Sun Java System Application Server 來配置 JMS 的通用資源配接卡。整體而言,可對資源配接卡進行配置以顯示 JMS 提供者是否支援 XA。另外也能指出可以用何種可能的模式與 JMS 提供者進行整合。資源配接卡支援兩種整合模式。第一種模式是以 JNDI 做為整合方式。在這種情況下,受管理物件是在 JMS 提供者的 JNDI 樹狀結構中設定,並由通用資源配接卡進行查找以供使用。如果該模式並不適合用於整合,還可以使用 JMS 管理物件 javabean 類別的 Java 反射來做為整合模式。您可以使用 Sun Java System Application Server 的 Administration Console 或 CLI 來配置資源配接卡。方法和配置其他資源配接卡均相同。

配置通用資源配接卡

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

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

    如需執行這項作業的步驟,請參閱 Admin Console 線上說明。在部署期間,請確實將通用資源配接卡的位置指定為 install-dir/lib/addons/resourceadapters/genericjmsra/genericra.rar。另外,您也必須指定資源配接卡特性小節中說明的特性。

  2. 建立連接器連線池

    如需執行這項作業的步驟,請參閱 Admin Console 線上說明。在 [新建連接器連線池] 頁面上,從 [資源配接卡] 組合方塊中選取 genericra。另外,請在 [連線定義] 組合方塊中,選取 javax.jms.QueueConnectionFactory,並指定在ManagedConnectionFactory 特性小節中所說明的特性。

  3. 建立連接器資源。

    如需執行這項作業的詳細程序,可以參照 Admin Console 線上說明。在 [新建連接器資源] 頁面上,選取您在先前的步驟中建立的池。

  4. 建立管理物件資源。

    如需執行這項作業的詳細程序,可以參照 Admin Console 線上說明。在 [新建管理物件資源] 頁面上,選取 genericra 做為 [資源配接卡],以及 javax.jms.Queue 做為 [資源類型]。按 [下一步],並在第二頁按一下 [增加特性]。在 [其他特性] 表格中,指定帶有 Name\\=clientQueue 值且名為 DestinationProperties 的新特性。如需有關更多特性的資訊,請參閱受管理物件資源特性小節的說明。

  5. 在 Sun Java System 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

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

com.sun.messaging.ConnectionFactory

無 

JMS 用戶端的 javax.jms.ConnectionFactory 實作的類別名稱。會在 ProviderIntegrationModejavabean 時加以使用。

QueueConnectionFactoryClassName

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

com.sun.messaging.QueueConnectionFactory

無 

JMS 用戶端的 javax.jms.QueueConnectionFactory 實作的類別名稱。會在 ProviderIntegrationModejavabean 時加以使用。

TopicConnectionFactoryClassName

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

com.sun.messaging.TopicConnectionFactory

無 

JMS 用戶端的 javax.jms.TopicConnectionFactory 實作的類別名稱。會在 ProviderIntegrationMode 指定為 javabean 時加以使用。

XAConnectionFactoryClassName

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

com.sun.messaging.XAConnectionFactory

無 

JMS 用戶端的 javax.jms.ConnectionFactory 實作的類別名稱。會在 ProviderIntegrationMode 指定為 javabean 時加以使用。

XAQueueConnectionFactoryClassName

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

com.sun.messaging.XAQueueConnectionFactory

無 

JMS 用戶端的 javax.jms.XAQueueConnectionFactory 實作的類別名稱。會在 ProviderIntegrationMode 指定為 javabean 時加以使用。

XATopicConnectionFactoryClassName

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

com.sun.messaging.XATopicConnectionFactory

無 

JMS 用戶端的 javax.jms.XATopicConnectionFactory 實作的類別名稱。會在 ProviderIntegrationModejavabean 時加以使用。

TopicClassName

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

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 提供者負責決定通用資源配接卡中的 RMPolicyXAResource 包裝程式,是否僅將 isSameRM 呼叫委託給訊息佇列提供者的 XA 資源實作。這應該非常適用於大部份的訊息佇列產品。

有些 XAResource 實作 (如 IBM MQ Series) 在進行每個實體連線時,都要仰賴資源管理員。單一作業事件中同一個佇列管理員進行內送和外送通訊時,會造成問題 (例如,當 MBD 傳送回應至目標時)。

RMPolicy 設定為 OnePerPhysicalConnection 時,通用資源配接卡中 XAResource 包裝程式實作的 isSameRM 會在委託至包裝物件前,檢查這兩個 XAResource 是否使用相同的實體連線。如需有關此特性的其他資訊,請參閱 Issue Tracker 資料庫中的問題 #5 (位於 Glassfish 網站)。

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 事件至應用程式伺服器。

受管理物件資源特性

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

特性名稱

有效值

預設值

說明

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

空 

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

時間 (以秒計) 

 

重新連線之間的間隔。