Sun Java System Application Server Enterprise Edition 8.1 2005Q2 高可用性管理指南

第 9 章 Java 訊息服務的負載平衡和容錯移轉

本章說明如何配置 Java 訊息服務 (JMS) 的負載平衡和容錯移轉,以與 Application Server 配合使用。其中包含以下主題︰

Java 訊息服務簡介

Java 訊息服務 (JMS) API 是一種允許 J2EE 應用程式和元件建立、傳送、接收以及讀取郵件的郵件傳送標準。它可啟用可靠的非同步鬆耦合分散式通訊。實作 JMS 的 Sun Java System Message Queue 3 2005Q1 (MQ) 與 Application Server 緊密整合在一起,可讓您建立諸如訊息導引 Bean (MDB) 之類的元件。

MQ 透過連接器模組 (也稱為資源介面,由 J2EE 連接器架構規格 1.5 定義) 與 Application Server 整合在一起。部署至 Application Server 的 J2EE 元件使用透過連接器模組整合的 JMS 提供者交換 JMS 訊息。在 Application Server 中建立 JMS 資源會在背景中建立連接器資源。因此,每個 JMS 作業均會在背景中呼叫連接器執行階段並使用 MQ 資源介面。

您可以透過管理主控台或 asadmin 指令行公用程式來管理 Java 訊息服務。

範例應用程式

mqfailover 範例應用程式說明了在訊息導引 Bean 接收來自 JMS 主題的內送訊息時的 MQ 容錯移轉。此範例包含 MDB 和應用程式用戶端。應用程式伺服器使 MDB 具有高可用性。如果某個代理程式中斷,則交談式狀態 (由 MDB 接收的訊息) 不需設定即可遷移至叢集中其他可用的代理程式實例。

此範例將安裝至以下目錄:

install_dir/samples/ee-samples/failover/apps/mqfailover

詳細資訊

如需有關 JMS 的更多資訊,請參閱「Sun Java System Application Server Enterprise Edition 8.1 2005Q2 Developer’s Guide」中的第 14 章「Using the Java Message Service」。如需有關連接器 (資源介面) 的更多資訊,請參閱「Sun Java System Application Server Enterprise Edition 8.1 2005Q2 Developer’s Guide」中的第 9 章「Developing Connectors」

如需有關 Sun Java System Message Queue 的更多資訊,請參閱 Sun Java System Message Queue 文件。如需有關 JMS API 的一般資訊,請參閱 JMS 網頁

配置 Java 訊息服務

Java 訊息服務配置可用於與 Sun Java System Application Server 叢集或實例的所有內收和外送連線。您可以使用以下方法配置 Java 訊息服務︰

您可以使用 JMS 連線工廠設定置換 Java 訊息服務配置。如需詳細資訊,請參閱「Sun Java System Application Server Enterprise Edition 8.1 2005Q2 管理指南」中的「有關 JMS 連線工廠的 管理主控台 作業」


備註 –

變更 Java 訊息服務的配置後,必須重新啟動 Application Server 實例。


如需有關 JMS 管理的更多資訊,請參閱「Sun Java System Application Server Enterprise Edition 8.1 2005Q2 管理指南」中的第 4 章「配置 Java 訊息服務資源」

Java 訊息服務整合

MQ 可透過以下兩種方式與 Application Server 進行整合︰LOCAL 與 REMOTE,在管理主控台中由 Java 訊息服務 Type 屬性表示。

LOCAL Java 訊息服務

當 Type 屬性為 LOCAL (獨立 Application Server 實例的預設) 時,Application Server 將啟動和停止被指定為預設 JMS 主機的 MQ 代理程式。LOCAL 類型最適合於獨立的 Application Server 實例。

若要在 Application Server 實例和 Message Queue 代理程式之間建立一對一的關係,請將類型設定為 LOCAL 並為每個 Application Server 實例指定不同的預設 JMS 主機。無論叢集是否在 Application Server 或 MQ 中定義,您均可執行此作業。

對於 LOCAL 類型,請使用 Start Arguments 屬性指定 MQ 代理程式的啟動參數。

REMOTE Java 訊息服務

當 Type 屬性為 REMOTE 時,必須單獨啟動 MQ 代理程式。如果在 Application Server 中定義了叢集,則此為預設。如需有關啟動代理程式的資訊,請參閱「Sun Java System Message Queue Administration Guide」。

在此情況下,Application Server 將使用外部配置的代理程式或代理程式叢集。此外,您必須從 Application Server 分別啟動和停止 MQ 代理程式,並使用 MQ 工具配置和調校代理程式或代理程式叢集。REMOTE 類型最適合於 Application Server 叢集。

對於 REMOTE 類型,您必須使用 MQ 工具指定 MQ 代理程式啟動參數。可忽略 Start Arguments 屬性。

JMS 主機清單

JMS 主機代表 MQ 代理程式。Java 訊息服務包含 JMS 主機清單 (也稱為 AddressList),該清單包含 Application Server 使用的所有 JMS 主機。

JMS 主機清單中包含指定 MQ 代理程式的主機和連接埠,並且每當變更 JMS 主機配置時,均會進行更新。在建立 JMS 資源或部署 MDB 時,它們會繼承 JMS 主機清單。


備註 –

在 Sun Java System Message Queue 軟體中,AddressList 特性稱為 imqAddressList


預設 JMS 主機

JMS 主機清單中有一台主機被指定為預設 JMS 主機,名為 Default_JMS_host。將 Java 訊息服務類型配置為 LOCAL 後,Application Server 實例會啟動預設的 JMS 主機。

如果您已在 Sun Java System Message Queue 軟體中建立了具有多個代理程式的叢集,請刪除預設 JMS 主機,然後增加 Message Queue 叢集的代理程式,並將其做為 JMS 主機。在此情況下,預設的 JMS 主機便成為 JMS 主機清單中的第一台主機。

當 Application Server 使用 Message Queue 叢集時,它會在預設 JMS 主機上執行 Message Queue 特定的指令。例如,為具有三個代理程式的 Message Queue 叢集建立實體目標後,雖然用於建立實體目標的指令在預設的 JMS 主機上執行,但該實體目標可由叢集中的所有三個代理程式使用。

建立 JMS 主機

您可以使用以下方法建立其他 JMS 主機︰

連線池儲存和容錯移轉

Application Server 支援 JMS 連線池儲存和容錯移轉。Sun Java System Application Server 可自動池儲存 JMS 連線。當 Address List Behavior 屬性為 random (預設) 時,Application Server 會從 JMS 主機清單中隨機選取其主代理程式。發生容錯移轉時,MQ 不需設定即可將負載傳輸至其他代理程式並可保持 JMS 語義不變。

若要指定在連線中斷後,Application Server 是否嘗試重新連線至主代理程式,請選取 [重新連線] 核取方塊。啟用後,如果主代理程式中斷,Application Server 會嘗試重新連線至 JMS 主機清單中的其他代理程式。

啟用 [重新連線] 後,還需指定以下屬性︰

您可以使用 JMS 連線工廠設定置換這些設定。如需詳細資訊,請參閱「Sun Java System Application Server Enterprise Edition 8.1 2005Q2 管理指南」中的「有關 JMS 連線工廠的 管理主控台 作業」

負載平衡的訊息流入

Application Server 可將訊息隨機傳送至具有相同 ClientID 的 MDB。長期用戶需要 ClientID

對於其中未配置 ClientID 的非長期用戶,訂閱相同主題的特定 MDB 之所有實例均視為相等。如果將 MDB 部署至 Application Server 的多個實例,則僅一個 MDB 會接收訊息。如果多個不同的 MDB 訂閱相同的主題,則每個 MDB 會有一個實例接收訊息的副本。

若要支援使用相同佇列的多個用戶,請將實體目標的 maxNumActiveConsumers 特性設定為較大的值。如果已設定此特性,則 MQ 可允許多達該數目的 MDB 使用同一佇列中的訊息。訊息會隨機傳送至 MDB。如果將 maxNumActiveConsumers 設定為 -1,則對用戶數目沒有限制。

將 MQ 叢集與應用程式伺服器配合使用

MQ Enterprise Edition 支援多個互連的代理程式實例 (稱為代理程式叢集)。對於代理程式叢集,用戶端連線會分散至叢集中的所有代理程式。叢集可提供水平可延伸性並可提高可用性。

本小節說明如何配置 Application Server 以使用具有高可用性的 Sun Java System Message Queue 叢集。其中說明了如何啟動與配置 Message Queue 叢集。

如需有關 Application Server 拓樸和 MQ 部署的更多資訊,請參閱「Sun Java System Application Server Enterprise Edition 8.1 2005Q2 Deployment Planning Guide」中的「Planning Message Queue Broker Deployment」

Procedure啟用 MQ 叢集與應用程式伺服器叢集

  1. 如果其中之一尚不存在,則建立應用程式伺服器叢集。

    如需有關建立叢集的資訊,請參閱建立叢集

  2. 建立 MQ 代理程式叢集。

    首先,刪除參照由網域管理伺服器啟動的代理程式的預設 JMS 主機,然後,建立三個要包含在 MQ 代理程式叢集中的外部代理程式 (JMS 主機)。

    使用管理主控台或 asadmin 指令行公用程式建立 JMS 主機。

    若要使用 asadmin,請參照以下的指令範例︰


    asadmin delete-jms-host --target cluster1 default_JMS_host
    asadmin create-jms-host --target cluster1
         --mqhost myhost1 --mqport 6769
         --mquser admin --mqpassword admin broker1
    asadmin create-jms-host --target cluster1
         --mqhost myhost2 --mqport 6770
         --mquser admin --mqpassword admin broker2
    asadmin create-jms-host --target cluster1
         --mqhost myhost3 --mqport 6771
         --mquser admin --mqpassword admin broker3

    若要使用管理主控台建立主機,請執行以下步驟︰

    1. 導覽至 [JMS 主機] 節點 ([配置] > [config-name] > [Java 訊息服務] > [JMS 主機])。

    2. 刪除預設代理程式 (default_JMS_host)。

      選取該代理程式旁邊的核取方塊,然後按一下 [刪除]。

    3. 按一下 [新建] 以建立每個 JMS 主機並輸入其特性值。

      填入主機名稱、DNS 名稱或 IP 位址、連接埠號碼、管理使用者名稱和密碼的值。

  3. 啟動主 MQ 代理程式和其他 MQ 代理程式。

    除了在 JMS 主機電腦上啟動三個外部代理程式以外,在任一機器上啟動一個主代理程式。此主代理程式不必為代理程式叢集的一部分。例如︰


    /usr/bin/imqbrokerd -tty -name brokerm -port 6772
     -cluster myhost1:6769,myhost2:6770,myhost2:6772,myhost3:6771
     -D"imq.cluster.masterbroker=myhost2:6772"
  4. 啟動該叢集中的應用程式伺服器實例。

  5. 在叢集上建立 JMS 資源︰

    1. 建立 JMS 實體目標。

      例如,使用 asadmin


      asadmin create-jmsdest --desttype queue --target cluster1 MyQueue
      asadmin create-jmsdest --desttype queue --target cluster1 MyQueue1

      若要使用管理主控台,請執行以下步驟︰

      1. 導覽至 [JMS 主機] 頁面 ([配置] > [config-name] > [Java 訊息服務] > [實體目標])。

      2. 按一下 [新建] 以建立每個 JMS 實體目標。

      3. 對於每個目標,輸入其名稱和類型 (佇列)。

    2. 建立 JMS 連線工廠。

      例如,使用 asadmin


      asadmin create-jms-resource --target cluster1
      --restype javax.jms.QueueConnectionFactory jms/MyQcf
      asadmin create-jms-resource --target cluster1
      --restype javax.jms.QueueConnectionFactory jms/MyQcf1

      若要使用管理主控台,請執行以下步驟︰

      1. 導覽至 [JMS 連線工廠] 頁面 ([資源] > [JMS 資源] > [連線工廠])。

      2. 若要建立每個連線工廠,按一下 [新建]。

        將開啟 [建立 JMS 連線工廠] 頁面。

      3. 對於每個連線工廠,輸入 JNDI 名稱 (例如 jms/MyQcf) 和類型 javax.jms.QueueConnectionFactory

      4. 從該頁面底部可用目標的清單中選取叢集,然後按一下 [增加]。

      5. 按一下 [確定] 以建立連線工廠。

    3. 建立 JMS 目標資源。

      例如,使用 asadmin


      asadmin create-jms-resource --target cluster1
           --restype javax.jms.Queue
           --property imqDestinationName=MyQueue jms/MyQueue
      asadmin create-jms-resource --target cluster1
           --restype javax.jms.Queue
           --property imqDestinationName=MyQueue1 jms/MyQueue1

      若要使用管理主控台,請執行以下步驟︰

      1. 導覽至 [JMS 目標資源] 頁面 ([資源] > [JMS 資源] > [連線工廠])。

      2. 若要建立每個目標資源,按一下 [新建]。

        將開啟 [建立 JMS 目標資源] 頁面。

      3. 對於每個目標資源,輸入 JNDI 名稱 (例如 jms/MyQueue) 和類型 javax.jms.Queue

      4. 從該頁面底部可用目標的清單中選取叢集,然後按一下 [增加]。

      5. 按一下 [確定] 以建立目標資源。

  6. 使用 –retrieve 選項為應用程式用戶端部署應用程式。例如︰


    asadmin deploy --target cluster1 
    --retrieve /opt/work/MQapp/mdb-simple3.ear
  7. 存取應用程式並對其進行測試,以確保其正常運作。

  8. 若要將 Application Server 復原為其預設 JMS 配置,請刪除您建立的 JMS 主機,然後重新建立預設。例如︰


    asadmin delete-jms-host --target cluster1 broker1
    asadmin delete-jms-host --target cluster1 broker2
    asadmin delete-jms-host --target cluster1 broker3
    asadmin create-jms-host --target cluster1
     --mqhost myhost1 --mqport 7676
     --mquser admin --mqpassword admin
     default_JMS_host

    您也可使用管理主控台執行等效作業。

疑難排解

如果遇到問題,請考量以下作業︰