本章說明如何配置 Java 訊息服務 (JMS) 的負載平衡和容錯移轉,以與 Application Server 配合使用。其中包含以下主題︰
Java 訊息服務 (JMS) API 是一種允許 Java EE 應用程式和元件建立、傳送、接收以及讀取郵件的郵件傳送標準。它可啟用可靠的非同步鬆耦合分散式通訊。實作 JMS 的 Sun Java System Message Queue (MQ),與 Application Server 緊密整合在一起,可讓您建立諸如訊息驅動 Bean (MDB) 之類的元件。
MQ 透過連接器模組 (也稱為資源配接卡,由 Java EE 連接器架構規格 1.5 版定義) 與 Application Server 整合在一起。部署至 Application Server 的 Java EE 元件則需使用透過連接器模組整合的 JMS 提供者交換 JMS 訊息。在 Application Server 中建立 JMS 資源會在背景中建立連接器資源。因此,每個 JMS 作業均會在背景中呼叫連接器執行階段並使用 MQ 資源配接卡。
您可以透過管理主控台或 asadmin 指令行公用程式來管理 Java 訊息服務。
如需有關配置 JMS 資源的更多資訊,請參閱「Sun Java System Application Server 9.1 管理指南」中的第 4 章「配置 Java 訊息服務資源」。如需有關 JMS 的更多資訊,請參閱「Sun Java System Application Server 9.1 Developer’s Guide 」中的第 18 章「Using the Java Message Service」。如需有關連接器 (資源配接卡) 的更多資訊,請參閱「Sun Java System Application Server 9.1 Developer’s Guide 」中的第 12 章「Developing Connectors」。
如需有關 Sun Java System Message Queue 的更多資訊,請參閱 Message Queue 文件。如需有關 JMS API 的一般資訊,請參閱 JMS 網頁
Java 訊息服務配置可用於與 Sun Java System Application Server 叢集或實例的所有內收和外送連線。您可以使用以下方法配置 Java 訊息服務︰
管理主控台。在相關配置下開啟 Java 訊息服務元件。如需更多資訊,請參閱「Sun Java System Application Server 9.1 管理指南」中的第 4 章「配置 Java 訊息服務資源」。
server.jms-service.init-timeout-in-seconds = 60 server.jms-service.type = LOCAL server.jms-service.start-args = server.jms-service.default-jms-host = default_JMS_host server.jms-service.reconnect-interval-in-seconds = 60 server.jms-service.reconnect-attempts = 3 server.jms-service.reconnect-enabled = true server.jms-service.addresslist-behavior = random server.jms-service.addresslist-iterations = 3 server.jms-service.mq-scheme = mq server.jms-service.mq-service = jms
您也可設定以下特性︰
server.jms-service.property.instance-name = imqbroker server.jms-service.property.instance-name-suffix = server.jms-service.property.append-version = false
使用 asadmin get指令可列出所有的 Java 訊息服務屬性和特性。如需有關 asadmin get 的更多資訊,請參閱 get(1)。 如需有關 asadmin set 的更多資訊,請參閱 set(1)。
您可以使用 JMS 連線工廠設定置換 Java 訊息服務配置。如需詳細資訊,請參閱「Sun Java System Application Server 9.1 管理指南」中的「JMS 連線工廠」。
變更 Java 訊息服務的配置後,必須重新啟動 Application Server 實例。
如需有關 JMS 管理的更多資訊,請參閱「Sun Java System Application Server 9.1 管理指南」中的第 4 章「配置 Java 訊息服務資源」
MQ 可透過以下三種方式與 Application Server 進行整合︰LOCAL、REMOTE 及 EMBEDDED。這些模式在管理主控台中由 Java 訊息服務 Type 屬性表示。
當 Type 屬性為 LOCAL (叢集實例的預設值) 時,Application Server 將啟動和停止被指定為預設 JMS 主機的 MQ 代理程式。MQ 程序是跨處理序啟動,與 Application Server 程序位於不同的 VM。Application Server 為代理程式提供了額外的連接埠。代理程式會使用此連接埠來啟動 RMI 登錄。此連接埠號將等於該實例已配置的 JMS 連接埠號加 100。例如,如果 JMS 連接埠號為 37676,則此額外的連接埠號為 37776。
若要在 Application Server 實例和 Message Queue 代理程式之間建立一對一的關係,請將類型設定為 LOCAL 並為每個 Application Server 實例指定不同的預設 JMS 主機。無論叢集是否在 Application Server 或 MQ 中定義,您均可執行此作業。
對於 LOCAL 類型,請使用 Start Arguments 屬性指定 MQ 代理程式的啟動參數。
當 Type 屬性為 REMOTE 時,必須單獨啟動 MQ 代理程式。如需有關啟動代理程式的資訊,請參閱「Sun Java System Message Queue Administration Guide」。
在此情況下,Application Server 將使用外部配置的代理程式或代理程式叢集。此外,您必須從 Application Server 分別啟動和停止 MQ 代理程式,並使用 MQ 工具配置和調校代理程式或代理程式叢集。REMOTE 類型最適合於 Application Server 叢集。
對於 REMOTE 類型,您必須使用 MQ 工具指定 MQ 代理程式啟動參數。可忽略 Start Arguments 屬性。
如果 JMS Type 屬性為 EMBEDDED,則表示 Application Server 和 JMS 代理程式並置於相同的 VM 中,且將在同處理序啟動 JMS 服務,並由 Application Server 管理。在此模式中的 JMS 作業會規避網路堆疊 ,以使效能最佳化。
JMS 主機代表 MQ 代理程式。Java 訊息服務包含 JMS 主機清單 (也稱為 AddressList),該清單包含 Application Server 使用的所有 JMS 主機。
JMS 主機清單中包含指定 MQ 代理程式的主機和連接埠,並且每當 JMS 主機配置變更時,此清單均會更新。在建立 JMS 資源或部署 MDB 時,它們會繼承 JMS 主機清單。
在 Sun Java System Message Queue 軟體中,AddressList 特性稱為 imqAddressList。
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 主機上執行,但該實體目標可由叢集中的所有三個代理程式使用。
使用管理主控台。開啟相關配置下的 [Java 訊息服務] 元件,選取 [JMS 主機] 元件,然後按一下 [新建]。如需更多資訊,請參閱管理主控台線上說明。
使用 asadmin create-jms-host 指令。如需詳細資訊,請參閱 create-jms-host(1)。
每當 JMS 主機配置發生變更時均會更新 JMS 主機清單。
Application Server 支援 JMS 連線池儲存和容錯移轉。Sun Java System Application Server 可自動地將 JMS 連線儲存到連線池。當 Address List Behavior 屬性為 random (預設) 時,Application Server 會從 JMS 主機清單中隨機選取其主代理程式。發生容錯移轉時,MQ 不需設定即可將負載傳輸至其他代理程式並可保持 JMS 語義不變。如果 JMS 的類型為 LOCAL,則 Address List Behavior 屬性的預設值為 priority。
若要指定在連線中斷後,Application Server 是否嘗試重新連線至主代理程式,請選取 [重新連線] 核取方塊。啟用後,如果主代理程式中斷,Application Server 會嘗試重新連線至 JMS 主機清單中的其他代理程式。
啟用 [重新連線] 後,還需指定以下屬性︰
位址清單運作方式:連線嘗試是依循 JMS 主機清單中的位址順序 (priority) 還是依循隨機順序 (random)。如果設定為 Priority,則 Java 訊息服務會嘗試連線至 JMS 主機清單中指定的第一個 MQ 代理程式,並且,當第一個代理程式不可用時,會使用其他代理程式。如果設定為 Random,則 Java 訊息服務會從 JMS 主機清單中隨機選取 MQ 代理程式。如果許多用戶端嘗試使用同一個連線工廠來進行連線,請使用此設定以防止它們全部嘗試連線至同一個位址。
Address List Iterations︰Java 訊息服務透過 JMS 主機清單反覆運算,以建立 (或重新建立) 連線的次數。值 -1 表示嘗試次數沒有限制。
重新連線嘗試:用戶端執行階段嘗試連線 (或重新連線) JMS 主機清單中每個位址的次數。到達這個值後,用戶端執行階段將嘗試連線到清單中的下一個位址。值 -1 表示重新連線嘗試次數沒有限制 (用戶端執行階段將嘗試連線至第一個位址直到連線成功)。
重新連線間隔:兩次重新連線嘗試之間的間隔秒數。此屬性適用於對 JMS 主機清單中每個位址的連線嘗試,及對該清單中連續位址的連線嘗試。如果該間隔太短,則代理程式將沒有時間恢復。如果該間隔太長,則重新連線會變得遲緩,以至於讓人無法接受。
您可以使用 JMS 連線工廠設定置換這些設定。如需詳細資訊,請參閱「Sun Java System Application Server 9.1 管理指南」中的「JMS 連線工廠」。
您可以使用 activation-config-property 元素,在 sun-ejb-jar.xml 檔案中為訊息驅動 Bean 配置 jmsra 資源配接卡的 ActivationSpec 特性。每當部署訊息驅動 Bean (EndPointFactory) 時,連接器執行階段引擎會尋找這些特性,接著配置在資源配接卡中。請參閱「Sun Java System Application Server 9.1 Application Deployment Guide」中的「activation-config-property」。
Application Server 不需設定即可將訊息隨機傳送到具有相同 ClientID 的訊息驅動 Bean。長期用戶需要 ClientID。
對於其中未配置 ClientID 的非長期訂閱者,訂閱相同主題的特定訊息驅動 Bean 之所有實例均視為相等。將訊息驅動 Bean 部署到 Application Server 的多個實例時,只有其中一個訊息驅動 Bean 會收到訊息。如果有多個不同的訊息驅動 Bean 訂閱相同的主題,則每個訊息驅動 Bean 的一個實例會接收到訊息的副本。
若要支援使用相同佇列的多個用戶,請將實體目標的 maxNumActiveConsumers 特性設定為較大的值。如果已設定此特性,Sun Java System Message Queue 軟體最多會允許該數量的訊息驅動 Bean 使用相同佇列的訊息。會將訊息隨機傳遞到訊息驅動 Bean。如果將 maxNumActiveConsumers 設定為 -1,則對用戶數目沒有限制。
若要確保優先使用本機傳遞,請將 addresslist-behavior 設定為 Priority。此設定指定先選取 AddressList 中的第一個代理程式。第一個代理程式是本機並置的 Message Queue 實例。如果無法使用此代理程式,則會依 AddressList 中列出的代理程式順序嘗試連線。此設定是屬於叢集的 Application Server 實例的預設值。
開發者設定檔中無法使用叢集功能。如需有關設定檔的資訊,請參閱「Sun Java System Application Server 9.1 管理指南」中的「用法設定檔」。
JMS 元件有兩層可用性:
服務可用性 – 此層級的重點在於 JMS 服務的可用性,即使有一段時間無法使用訊息也無關緊要。只要將連線容錯移轉到提供服務的可用新實例,JMS 元件就會將服務視為可用且會正常運作。「Sun Java System Application Server 9.1 Developer’s Guide 」中的「Connection Failover」說明了此可用性層級。
資料可用性 – 此層級的服務和持續性訊息可用性都不可或缺。此層級也處理一次 (且只有一次) 傳送及訊息排序作業的 JMS 語義。
您可以在包含 Java 訊息服務 (JMS) 的 Sun Java System Message Queue 叢集中啟用資料可用性。訊息會保留在共用持續性存放區中,並可從叢集中的其他所有代理程式實例或高可用性資料庫 (HADB) (但必須已安裝,並已選取企業設定檔) 取得。如需有關設定檔的資訊,請參閱「Sun Java System Application Server 9.1 管理指南」中的「用法設定檔」。您必須先啟用 Application Server 實例的可用性,才能為相應的代理程式啟用資料可用性。
個別的應用程式和模組無法控制或覆寫 JMS 可用性。
若要啟用資料可用性,請在管理主控台中選取相關配置下的「可用性服務」元件。核取 [可用性服務] 核取方塊。若要為 JMS 服務啟用可用性,請選取 [JMS 可用性] 標籤,然後核取 [可用性服務] 方塊。Application Server 叢集中的所有實例應該具有相同的實例可用性和 JMS 可用性設定,才能確保運作方式一致。如需詳細資訊,請參閱「Sun Java System Application Server 9.1 高可用性管理指南」。
開發者設定檔中無法使用叢集功能。如需有關設定檔的資訊,請參閱「Sun Java System Application Server 9.1 管理指南」中的「用法設定檔」。
MQ Enterprise Edition 支援多個互連的代理程式實例 (稱為代理程式叢集)。對於代理程式叢集,用戶端連線會分散至叢集中的所有代理程式。叢集可提供水平可延伸性並可提高可用性。
本小節說明如何配置 Application Server 以使用具有高可用性的 Sun Java System Message Queue 叢集。其中說明了如何啟動與配置 Message Queue 叢集。
如需有關 Application Server 拓樸和 MQ 部署的更多資訊,請參閱「Sun Java System Application Server 9.1 部署規劃指南」中的「Planning Message Queue Broker Deployment」。
Sun Java System Message Queue 4.1 透過新的「高度可用」叢集類型,提供高度可用的訊息服務。在此類型的 MQ 叢集中,所有代理程式實例都會共享對等式關係,且其所有代理程式實例都使用相同的持續性資料存放區。各實例會自動偵測是否有故障的實例,並透過動態接管選擇的方式,接管故障代理程式的持續性訊息。因此 Application Server 中部署的應用程式元件可利用這些可用性功能。
此叢集類型可讓佇列或長期主題訂閱不會遺失任何處理的持續性訊息。當用戶端執行階段所連線的代理程式無法使用時,就可能會遺失傳送至非長期訂閱者的非持續性訊息或持續性訊息。
啟動 HADB。
建立並啟動 Application Server 網域。若要建立並啟動網域,請分別使用 asadmin 指令 create-domain 和 start-domain。如需這些指令的更多資訊,請參閱create-domain(1) 和 start-domain(1)。
建立並啟動節點代理程式。若要建立並啟動節點代理程式,請分別使用 asadmin 指令 create-node-agent 和 start-node-agent。如需這些指令的更多資訊,請參閱 create-node-agent(1) 和 start-node-agent(1)。
建立叢集。您可以使用 asadmin 指令 create-cluster 或管理主控台來建立叢集。如需有關 create-cluster 指令的更多資訊,請參閱 create-cluster(1)。如需如何使用管理主控台建立叢集的更多資訊,請參閱管理主控台線上說明。
在叢集中建立實例。建立實例時,請指定遠端代理程式所使用的 JMS 提供者連接埠號。如果未指定,則使用預設的 JMS 提供者連接埠號。您可以使用管理主控台或 asadmin 指令 create-instance 來建立實例。如需如何使用管理主控台建立實例的更多資訊,請參閱管理主控台線上說明。如需有關 create-instance 指令的資訊,請參閱 create-instance(1)。
啟動叢集。您可以從管理主控台或使用 asadmin 指令 start-cluster 執行此動作。如需有關如何使用管理主控台啟動叢集的更多資訊,請參閱管理主控台線上說明。如需有關 start-cluster 指令的資訊,請參閱 start-cluster(1)。
使用 asadmin 指令 configure-ha-cluster 配置 HA 叢集。如需有關此指令的資訊,請參閱 configure-ha-cluster(1)。
啟動 HADB。
建立資料庫表格。
若是建立高度可用的代理程式叢集,請複製 HA 驅動程式。
cp $AS_HOME/hadb/4.4.3-6/lib/hadbjdbc4.jar $S1AS_HOME/imq/lib/ext
建立並啟動網域。若要執行此動作,請使用指令 asadmin 指令 create-domain 和 start-domain。如需這些指令的更多資訊,請參閱 create-domain(1) 和 start-domain(1)。
建立並啟動節點代理程式。若要執行此動作,請使用 asadmin 指令 create-domain 和 start-node-agent。如需這些指令的更多資訊,請參閱 create-node-agent(1) 和 start-node-agent(1)。
建立叢集。您可以使用 asadmin 指令 (create-cluster) 或管理主控台來建立叢集。如需更多資訊,請參閱 create-cluster(1)。如需如何使用管理主控台建立叢集的更多資訊,請參閱管理主控台線上說明。
在叢集中建立實例。建立實例時,請指定遠端代理程式所使用的 JMS 提供者連接埠號。如果未指定,則使用預設的 JMS 提供者連接埠號。
刪除預設的 JMS 主機,並建立實例可連線的 JMS 主機。請確定將每一個代理程式新增為獨立的 JMS 主機。如需有關 JMS 主機的更多資訊,請參閱 JMS 主機清單。
將 JMS 類型設定為 Remote。您可以使用 asadmin 指令 set 或從管理主控台的 [JMS 服務] 頁面執行此動作。
若是配置高度可用的代理程式,請將 [JMS 可用性] 設定為 true。您可以使用 asadmin 指令 set 或從管理主控台的 [JMS 可用性] 頁面執行此動作。
啟動代理程式實例。
啟動叢集。如需更多資訊,請參閱 start-cluster(1)。
以前管理員必須依照本節的下列程序分別設定「非高度可用的」MQ 叢集 (具有主代理程式的 MQ 叢集)。在此發行版本中,除了 MQ 叢集的手動設定程序 (屬於類型 REMOTE) 外,Application Server 也提供了「自動叢集功能」,這意味著當使用者建立 Application Server 叢集時,將自動建立並置的非 HA 叢集 (屬於類型 LOCAL)。這將是建立 MQ 叢集的預設模式。例如,當管理員建立一個內含三個 Application Server 實例的 Application Server 叢集時,會將每個 Application Server 實例配置成使用一個並置的代理程式,因此不需設定即可使三個 MQ 代理程式實例形成一個 MQ 叢集。第一個 Application Server 實例的 MQ 代理程式會被設定為主代理程式。不過自動叢集功能也有一個缺點。如果管理員將實例新增到叢集,自動建立的 MQ 代理程式實例將無法加入到叢集中。此運作方式也適用於從叢集移除實例的情況。
如果叢集的類型是 REMOTE,請執行下列步驟。如果叢集的類型是 LOCAL,則步驟 1 到步驟 4 不適用。
如果其中之一尚不存在,則建立 Application Server 叢集。
如需有關建立叢集的資訊,請參閱建立叢集。
建立 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 |
若要使用管理主控台建立主機,請執行以下步驟︰
啟動主 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" |
啟動該叢集中的 Application Server 實例。
在叢集上建立 JMS 資源︰
建立 JMS 實體目標。
例如,使用 asadmin︰
asadmin create-jmsdest --desttype queue --target cluster1 MyQueue asadmin create-jmsdest --desttype queue --target cluster1 MyQueue1 |
若要使用管理主控台,請執行以下步驟︰
建立 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 |
若要使用管理主控台,請執行以下步驟︰
建立 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 |
若要使用管理主控台,請執行以下步驟︰
使用 –retrieve 選項為應用程式用戶端部署應用程式。例如︰
asadmin deploy --target cluster1 --retrieve /opt/work/MQapp/mdb-simple3.ear |
存取應用程式並對其進行測試,以確保其正常運作。
若要將 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 |
您也可使用管理主控台執行等效作業。
如果遇到問題,請考量以下作業︰
檢視 as-install-dir/nodeagents/node-agent-name/ instance-name/logs/server.log 上的 Application Server 記錄檔。如果您在記錄檔中看到 MQ 代理程式未回應訊息,請停止該代理程式,然後將其重新啟動。
檢視 as-install-dir /nodeagents/node-agent-name/ instance-name/imq/imq-instance-name/log/log.txt 中提供的代理程式記錄。
對於 Remote JMS 類型,請務必先啟動 MQ 代理程式,再啟動 Application Server 實例。
當所有 MQ 代理程式均中斷後,使用 Java 訊息服務中的預設值中斷或啟動 Application Server 需花費 30 分鐘。調校 Java 訊息服務值可取得此逾時可接受的值。例如︰
asadmin set --user admin --password administrator cluster1.jms-service.reconnect-interval-in-seconds=5