Sun Java System Message Queue 4.1 版本說明

關於 Message Queue 4.0

Message Queue 4.0 是僅支援 Application Server 9 PE 的發行版本。此為包含一些新功能、次要增強功能和錯誤修正的次要發行版本。本節包含下列資訊。

4.0 版的新增功能

Message Queue 4.0 包含下列新增功能:

這些資訊都會在下列小節中詳述。


注意 – 注意 –

4.0 版推出的其中一個變更極為次要,但可能會造成重大問題,亦即停用指定密碼的指令行選項。因此,您必須如已停用的密碼選項中所述,把所有密碼儲存在一個檔案中。


C API 與 C 用戶端執行階段的介面變更

Message Queue 4.0 版增加兩個特性,停用的訊息佇列中所有的訊息都會設定這兩個特性。

Java API 與 Java 用戶端執行階段的介面變更

Message Queue 4.0 版增加兩個特性,停用的訊息佇列中所有的訊息都會設定這兩個特性。

顯示關於永久存放區的資訊

imqdbmgr 指令已增加 query 子指令。使用此子指令可顯示關於永久存放區的資訊,包含存放區版本、資料庫使用者,以及是否已建立資料庫表格。

以下是該指令所顯示之資訊的範例。


imqdbmgr query

[04/Oct/2005:15:30:20 PDT] Using plugged-in persistent store:
        version=400
        brokerid=Mozart1756
        database connection url=jdbc:oracle:thin:@Xhome:1521:mqdb
        database user=scott
Running in standalone mode.
Database tables have already been created.

永久存放區格式變更

Message Queue 3.7 UR1 版推出了永久存放區格式的兩項變更,可改善效能。其中一項變更針對檔案存放區,另一項則針對 JDBC 存放區。

由於這些變更會影響存放區相容性,因此在 Message Queue 3.7 UR1 版中,檔案存放區和 JDBC 存放區的存放區版本皆已由 350 變更為 370。

Message Queue 4.0 版變更了 JDBC 存放區,以取得最佳效能並支援後續的增強功能。因此,JDBC 存放區版本已提昇為 400。請注意,在 4.0 版中,檔案式永久存放區版本沒有任何變更,因此還是 370。

Message Queue 4.0 支援將永久存放區自動轉換為檔案式和 JDBC 永久存放區的最新版本。初次啟動 imqbrokerd 時,如果公用程式偵測到舊版存放區,則會將該存放區遷移至新的格式,同時保留舊版存放區。

若要回復此升級動作,請解除安裝 Message Queue 4.0,然後重新安裝之前執行的版本。由於舊版的存放區副本保留不變,因此代理程式可利用舊版的存放區副本執行。

代理程式管理

指令公用程式 (imqcmd) 已增加子指令和數個選項,可讓管理員靜止代理程式、在指定間隔時間後關閉代理程式、銷毀連線,或設定 Java 系統特性 (例如連線相關特性)

如需有關 imqcmd 指令之語法的完整資訊,請參閱「Sun Java System Message Queue 4.1 Administration Guide」中的第 13 章「Command Line Reference」

JDBC 永久性支援

現在支援將 Apache Derby 10.1.1 版視為 JDBC 相容永久存放區的提供者。

SSL 支援

自 4.0 版起,用戶端連線工廠特性 imqSSLIsHostTrusted 的預設值為 false。若應用程式相依於之前的預設值 true,您需要重新配置並將特性明確設定為 true

當代理程式配置為使用自我簽署的憑證時,您可以選擇信任主機。此時,除了指定連線應使用基於 SSL 的連線服務 (使用 imqConnectionType 特性),還應該將 imqSSLIsHostTrusted 特性設定為 true。

例如,若要在代理程式使用自我簽署的憑證時安全地執行用戶端應用程式,請使用如下的指令。

java -DimqConnectionType=TLS 
      -DimqSSLIsHostTrusted=true <ClientAppName>

若要在代理程式使用自我簽署的憑證時安全地執行管理工具 imqcmd,請使用如下的指令。

imqcmd list svc -secure -DimqSSLIsHostTrusted=true

JMX 支援

已增加符合 Java Management Extensions (JMX) 規格,且可用於配置與監視 Message Queue 代理程式的新 API。您可以使用此 API,從 Message Queue 用戶端應用程式內以程式化方式配置並監視代理程式功能。在 Message Queue 的早期版本中,這些功能只能從指令行或管理主控台存取。

API 包含一組 JMX 受管理 Bean (MBean),以用於管理下列與 Message Queue 相關的資源:

這些 MBean 提供一些屬性作業,以同步輪詢與處理基礎資源的狀態,並提供通知,以允許用戶端應用程式以非同步方式偵聽並回應狀態變更。用戶端應用程式可使用 JMX API,執行如下的配置與監視作業:

如需有關 JMX API 的簡介以及完整參考資訊,請參閱「Sun Java System Message Queue 4.1 Developer’s Guide for JMX Clients」

代理程式支援:JMX 相關特性

增加了數個新的代理程式特性以支援 JMX API (請參閱表 1–3)。您無法使用 Message Queue 指令公用程式 (imqcmd) 從指令行設定這些特性;而是要使用代理程式公用程式 (imqbrokerd) 的 -D 選項設定,或是在代理程式的實例配置檔案 (config.properties) 中手動編輯。此外,其中的部分特性 (imq.jmx.rmiregistry.start imq.jmx.rmiregistry.use imq.jmx.rmiregistry.port) 可以透過表 1–4 中所述之新的代理程式公用程式選項進行設定。該表列出每個選項、指定其類型,並說明其用途。

表 1–3 JMX 支援功能的新代理程式特性

特性 

類型 

說明 

imq.jmx.rmiregistry.start

Boolean

指定是否在代理程式啟動時啟動 RMI 登錄。

若為 true,則代理程式會在 imq.jmx.rmiregistry.port 指定的連接埠啟動 RMI 登錄,並使用該登錄儲存 JMX 連接器的 RMI stub。請注意,此時會忽略 imq.jmx.rmiregistry.use 的值。

預設值:false

imq.jmx.rmiregistry.use

Boolean

指定是否使用外部 RMI 登錄。

僅在 imq.jmx.rmiregistry.startfalse 時適用。

若為 true,則代理程式會在 imq.jmx.rmiregistry.port 指定的連接埠使用外部 RMI 登錄,以儲存 JMX 連接器的 RMI stub。代理程式啟動時,必須已在執行外部 RMI 登錄。

預設值:false

imq.jmx.rmiregistry.port

Integer

RMI 登錄的連接埠號

僅在 imq.jmx.rmiregistry.startimq.jmx.rmiregistry.usetrue 時適用。接著可藉由在 JMX 服務 URL 的 URL 路徑中包含此連接埠號,以配置 JMX 連接器使用 RMI 登錄。

預設值:1099

imq.jmx.connector.list

String

預先配置的 JMX 連接器名稱,以逗號分隔

預設值:jmxrmi,ssljmxrmi

imq.jmx.connector.activelist

String

代理程式啟動時要啟動的 JMX 連接器名稱,以逗號分隔

預設值:jmxrmi

imq.jmx.connector.connectorName.urlpath

String

連接器 connectorName 之 JMX 服務 URL 的 urlPath 元件

這在 JMX 服務 URL 路徑必須明確設定時 (例如使用共用外部 RMI 登錄時),會很有用。

預設值:若是使用 RMI 登錄儲存 JMX 連接器的 RMI stub (亦即如果 imq.jmx.registry.startimq.jmx.registry.usetrue)

   /jndi/rmi://brokerHost:rmiPort
      /brokerHost/brokerPort/connectorName

若未使用 RMI 登錄 (根據預設,imq.jmx.registry.startimq.jmx.registry.use 皆為 false):

   /stub/rmiStub

其中 rmiStub 是 RMI stub 本身的已編碼和串列化表示式

 

imq.jmx.connector.connectorName.useSSL

Boolean

指定連接器 connectorName 是否使用安全傳輸層 (SSL)。

預設值:false

imq.jmx.connector.connectorName.brokerHostTrusted

Boolean

指定是否信任代理程式提供給連接器 connectorName 的所有憑證。

僅在 imq.jmx.connector.connectorName.useSSLtrue 時適用。

若為 false,Message Queue 用戶端執行階段會驗證提供給它的所有憑證。若憑證的簽署者不在用戶端信任清單存放區中,驗證就會失敗。

若為 true,則會略過憑證的驗證。這在軟體測試期間使用自我簽署的憑證這類情況時,就很有用。

預設值:false

imq.jmx.connector.list 特性會定義一組在代理程式啟動時建立的已命名 JMX 連接器;imq.jmx.connector.activelist 會指定其中要啟動的連接器。每個已命名的連接器接著會有各自的特性集:

imq.jmx.connector.connectorName .urlpath

imq.jmx.connector.connectorName .useSSL

imq.jmx.connector.connectorName .brokerHostTrusted

根據預設,會建立兩個 JMX 連接器,名為 jmxrmissljmxrmi;第一個連接器會配置為不使用 SSL 加密 (imq.jmx.connector.jmxrmi.useSSL = false),第二個連接器則使用 (imq.jmx.connector.ssljmxrmi.useSSL = true)。根據預設,代理程式啟動時只會啟動 jmxrmi 連接器;請參閱JMX 用戶端的 SSL 支援,以取得有關如何啟動 ssljmxrmi 連接器進行安全通訊的資訊。

為方便使用,還在指令行代理程式公用程式 (imqbrokerd) 中增加了新的選項 (表 1–4),以控制 RMI 登錄的使用、啟動和連接埠。這些選項的用法和效果與其等效代理程式特性 (如表 1–3 中所述) 相同。該表列出每個選項、指定其等效代理程式特性,並說明其用法。

表 1–4 JMX 支援功能的新代理程式公用程式選項

選項 

等效代理程式特性 

說明 

-startRmiRegistry

imq.jmx.rmiregistry.start

指定是否在代理程式啟動時啟動 RMI 登錄。

-useRmiRegistry

imq.jmx.rmiregistry.use

指定是否使用外部 RMI 登錄。

-rmiRegistryPort

imq.jmx.rmiregistry.port

RMI 登錄的連接埠號

一個新的子指令 (表 1–5) 增加至指令行指令公用程式 (imqcmd),以列出在代理程式啟動時建立和啟動的 JMX 連接器之 JMX 服務 URL。JMX 用戶端若要不使用 Message Queue 簡易類別 AdminConnectionFactory 即取得其 JMX 連接器,就需要此資訊。此資訊也可用於透過 Java 監視與管理主控台 (jconsole) 等一般 JMX 瀏覽器,來管理與監視 Message Queue。

表 1–5 新指令公用程式子指令

子指令 

說明 

list jmx

列出 JMX 連接器的 JMX 服務 URL

JMX 用戶端的 SSL 支援

如上所述,預設會將 Message Queue 訊息代理程式配置為使用預先配置之 JMX 連接器 jmxrmi,進行不安全的通訊。應用程式若要使用安全傳輸層 (SSL) 進行安全通訊,則必須啟動另一個安全的 JMX 連接器 ssljmxrmi。此項作業需要下列步驟:

  1. 如「Message Queue Administration Guide」中所述,使用與 ssljmsssladmincluster 連線服務相同的方式取得並安裝簽署的憑證。

  2. 視需要在信任清單存放區中安裝根憑證授權單位的憑證。

  3. ssljmxrmi 連接器增加至要在代理程式啟動時啟動的 JMX 連接器清單:

    imq.jmx.connector.activelist=jmxrmi,ssljmxrmi

  4. 使用 Message Queue 代理程式公用程式 (imqbrokerd) 啟動代理程式,然後傳遞密碼檔案中的金鑰庫密碼,或在提示時從指令行輸入。

  5. 根據預設,ssljmxrmi 連接器 (或任何其他基於 SSL 的連接器) 會配置為驗證所有提供給它的代理程式 SSL 憑證。若要避免此驗證 (例如,在軟體測試期間使用自我簽署的憑證時),請將代理程式特性 imq.jmx.connector.ssljmxrmi.brokerHostTrusted 設定為 true

配置用戶端的管理員連線工廠 (AdminConnectionFactory) 時,內含的 URL 必須指定 ssljmxrmi 為喜好的連接器:

AdminConnectionFactory  acf = new AdminConnectionFactory();
acf.setProperty(AdminConnectionConfiguration.imqAddress, "mq://myhost:7676/ssljmxrmi");

請視需要使用系統特性 javax.net.ssl.trustStorejavax.net.ssl.trustStorePassword,將 JMX 用戶端指向信任清單存放區。

用戶端執行階段記錄

本節說明 Message Queue 4.0 如何針對連線和階段作業相關事件,支援用戶端執行階段的記錄功能。

JDK 1.4 (及以上版本) 包含 java.util.logging 程式庫。此程式庫會實作可用於應用程式特定記錄的標準記錄程式介面。

Message Queue 用戶端執行階段使用 Java 記錄 API 實作其記錄功能。您可以使用所有 J2SE 1.4 記錄功能來配置記錄作業。例如,應用程式可使用下列 Java 記錄功能,配置 Message Queue 用戶端執行階段輸出其記錄資訊的方式:

如需有關 Java 記錄 API 的更多資訊,請參閱「Java Logging Overview」,網址為 http://java.sun.com/j2se/1.4.2/docs/guide/util/logging/overview.html

記錄名稱空間、層級和作業

Message Queue 提供者會定義一組與記錄層級和記錄作業相關的記錄名稱空間,可在適當設定記錄配置時,讓 Message Queue 用戶端記錄連線與階段作業事件。

Message Queue 用戶端執行階段的根記錄名稱空間定義為 javax.jms。Message Queue 用戶端執行階段的所有記錄程式皆使用此名稱做為父系名稱空間。

Message Queue 用戶端執行階段使用的記錄層級與 java.util.logging.Level 類別中所定義的記錄層級相同。此類別會定義七個標準記錄層級,以及可用於啟動與關閉記錄的兩個其他設定。

OFF

關閉記錄。

SEVERE

最高優先權、最高值。由應用程式定義。

WARNING

由應用程式定義。

INFO

由應用程式定義。

CONFIG

由應用程式定義。

FINE

由應用程式定義。

FINER

由應用程式定義。

FINEST

最低優先權、最低值。由應用程式定義。

ALL

啟用所有訊息的記錄。

一般來說,Message Queue 用戶端執行階段中發生的異常與錯誤,皆由記錄程式使用 javax.jms 名稱空間所記錄。

下表列出可記錄的事件,以及必須設定的記錄層級以記錄 JMS 連線與階段作業事件。

下表說明連線的記錄層級與事件。

表 1–6 javax.jms.connection 名稱空間的記錄層級與事件

記錄層級 

事件 

FINE

已建立連線 

FINE

已啟動連線 

FINE

已關閉連線 

FINE

已中斷連線 

FINE

已重新連線 

FINER

其他連線作業,例如 setClientID

FINEST

訊息、確認、Message Queue 動作與控制訊息 (如正在確定作業事件) 

下列階段作業資訊會記錄在記錄中。

下表說明階段作業的記錄層級與事件。

表 1–7 javax.jms.session 名稱空間的記錄層級與事件

記錄層級 

事件 

FINE

已建立階段作業 

FINE

已關閉階段作業 

FINE

已建立產生器 

FINE

已建立用戶 

FINE

已建立目標 

FINER

其他階段作業,例如正在確定階段作業。 

FINEST

已產生並使用訊息。(訊息特性與內文不會記錄在記錄中) 

根據預設,會從應用程式執行所在的 JRE 繼承輸出記錄層級。請檢查 JRE_DIRECTORY/lib/logging.properties 檔案以判斷該層級為何。

您可以程式化方式或藉由使用配置檔案來配置記錄功能,且可控制記錄發生的範圍。以下小節說明這些可能的作業。

使用 JRE 記錄配置檔案

下列範例說明如何在 JRE_DIRECTORY/lib/logging.properties 檔案中設定記錄名稱空間與層級,該檔案將用以設定 Java 執行階段環境的記錄層級。使用此 JRE 的所有應用程式會有相同的記錄配置。以下的配置範例會將 javax.jms.connection 名稱空間的記錄層級設定為 INFO,並指定將輸出寫入 java.util.logging.ConsoleHandler

#logging.properties file.
# "handlers" specifies a comma separated list of log Handler 
# classes. These handlers will be installed during VM startup.
# Note that these classes must be on the system classpath.
# By default we only configure a ConsoleHandler, which will only
# show messages at the INFO and above levels.

	handlers= java.util.logging.ConsoleHandler

# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers. For any given facility this global level
# can be overriden by a facility-specific level.
# Note that the ConsoleHandler also has a separate level
# setting to limit messages printed to the console.

    .level= INFO

# Limit the messages that are printed on the console to INFO and above.

    java.util.logging.ConsoleHandler.level = INFO
    java.util.logging.ConsoleHandler.formatter = 
                                    java.util.logging.SimpleFormatter

# The logger with javax.jms.connection name space will write
# Level.INFO messages to its output handler(s). In this configuration 
# the ouput handler is set to java.util.logging.ConsoleHandler.

    javax.jms.connection.level = INFO

使用特定應用程式的記錄配置檔案

您也可以從用於執行應用程式的 Java 指令行來定義記錄配置檔案。應用程式會使用指定的記錄檔中所定義之配置。在下列範例中,configFile 使用 JRE_DIRECTORY/lib/logging.properties 檔案中所定義的相同格式。

java -Djava.util.logging.config.file=configFile MQApplication

以程式化方式設定記錄配置

下列程式碼使用 java.util.logging API,將 javax.jms.connection 名稱空間記錄層級變更為 FINE,以記錄連線事件。您可以在應用程式中包含這類程式碼,從而以程式化方式設定記錄配置。

import java.util.logging.*;
//construct a file handler and output to the mq.log file 
//in the system's temp directory.

    Handler fh = new FileHandler("%t/mq.log");
    fh.setLevel (Level.FINE);

//Get Logger for "javax.jms.connection" domain.

    Logger logger = Logger.getLogger("javax.jms.connection");
    logger.addHandler (fh);

//javax.jms.connection logger would log activities   
//with level FINE and above.

    logger.setLevel (Level.FINE);

連線事件通知

連線事件通知可讓 Message Queue 用戶端偵聽關閉事件與重新連線事件,並根據通知類型與連線狀態採取適當的動作。例如,當發生容錯移轉且用戶端重新連線至其他代理程式時,應用程式最好清除作業事件狀態,並進行新的作業事件。

如果 Message Queue 提供者偵測到嚴重的連線問題,它會呼叫連線物件的已註冊之異常偵聽程式。它會呼叫偵聽程式的 onException 方法,並傳遞描述問題的 JMSException 引數給該方法。Message Queue 提供者亦可提供事件通知 API,讓用戶端執行階段將連線狀態的變更通知應用程式。通知 API 由下列元素所定義:

以下小節說明可觸發通知的事件,並說明建立事件偵聽程式的方式。

連線事件

下表列出並說明事件偵聽程式會傳回的事件。

請注意,發生連線事件時,不會呼叫 JMS 異常偵聽程式。只有在用戶端執行階段用盡重新連線的嘗試次數時,才會呼叫異常偵聽程式。用戶端執行階段一律會先呼叫事件偵聽程式,再呼叫異常偵聽程式。

表 1–8 通知事件

事件類型 

意義 

ConnectionClosingEvent

當 Message Queue 用戶端執行階段收到代理程式的通知,指出由於管理員請求關閉,因此連線即將關閉時,即會產生此事件。 

ConnectionClosedEvent

當連線由於代理程式錯誤或由於管理員請求關閉或重新啟動而關閉時,Message Queue 用戶端執行階段會產生此事件。 

當事件偵聽程式收到 ConnectionClosedEvent 時,應用程式可使用已接收事件的 getEventCode() 方法取得指出關閉原因的事件代碼。

ConnectionReconnectedEvent

Message Queue 用戶端執行階段已重新連線至代理程式。這可能是用戶端之前連線的同一個或不同的代理程式。 

應用程式可使用已接收事件的 getBrokerAddress 方法取得重新連線的代理程式位址。

ConnectionReconnectFailedEvent

Message Queue 用戶端執行階段無法重新連線至代理程式。每次重新連線嘗試失敗時,執行階段即會產生新的事件,並將其傳送到事件偵聽程式。 

發生連線事件時,不會呼叫 JMS 異常偵聽程式。只有在用戶端執行階段用盡重新連線的嘗試次數時,才會呼叫。用戶端執行階段一律會先呼叫事件偵聽程式,再呼叫異常偵聽程式。 

建立事件偵聽程式

下列程式碼範例描述設定連線事件偵聽程式的方式。每次發生連線事件時,用戶端執行階段便會呼叫事件偵聽程式的 onEvent 方法。

//create an MQ connection factory.

com.sun.messaging.ConnectionFactory factory =
        new com.sun.messaging.ConnectionFactory();

//create an MQ connection.

com.sun.messaging.jms.Connection connection = 
       (com.sun.messaging.jms.Connection )factory.createConnection();

//construct an MQ event listener.  The listener implements 
//com.sun.messaging.jms.notification.EventListener interface.

com.sun.messaging.jms.notification.EventListener eListener = 
       new ApplicationEventListener();

//set event listener to the MQ connection.

connection.setEventListener ( eListener );

事件偵聽程式範例

在此範例中,應用程式選擇事件偵聽程式將連線事件記錄到應用程式的記錄系統:

public class ApplicationEventListener implements
				com.sun.messaging.jms.notification.EventListener {

public void onEvent ( com.sun.messaging.jms.notification.Event connEvent ) {
      	log (connEvent);
}
private void log ( com.sun.messaging.jms.notification.Event connEvent ) {
	      String eventCode = connEvent.getEventCode(); 
      	String eventMessage = connEvent.getEventMessage();
    	  //write event information to the output stream.
     	}
}

硬體與軟體需求

如需有關 4.0 版軟硬體需求的資訊,請參閱 Sun Java System Application Server Platform Edition 9 的版本說明。