Apache ActiveMQ Artemis 的核心設計為一組簡單的 Plain Old Java Objects (POJO) - 我們希望您會喜歡其簡潔的設計。
每個 Apache ActiveMQ Artemis 伺服器都有其自己的超高效能持久日誌,用於訊息和其他持久性。
使用高效能日誌可以實現驚人的持久訊息效能,這是使用關聯式資料庫進行持久化時無法實現的(儘管如有必要,JDBC 仍然是一個選項)。
Apache ActiveMQ Artemis 用戶端(可能位於不同的實體機器上)與 Apache ActiveMQ Artemis Broker 互動。Apache ActiveMQ Artemis 目前在客戶端提供了三種用於訊息傳遞的 API 實作:
-
核心用戶端 API。這是一個簡單直觀的 Java API,與 Artemis 內部的核心對齊。允許對 Broker 物件進行更多控制(例如直接建立位址和佇列)。核心 API 還提供了一整套訊息傳遞功能,而沒有 JMS 的一些複雜性。
-
JMS 2.0 用戶端 API。標準的 JMS API 在客戶端可用。此用戶端也符合 Jakarta Messaging 2.0 規範。
-
Jakarta Messaging 3.0 用戶端 API。它與 JMS 2.0 API 本質上相同。唯一的區別是套件名稱使用
jakarta
而不是javax
。此差異是因從 Oracle 的 Java EE 遷移到 Eclipse 的 Jakarta EE 而引入的。
Apache ActiveMQ Artemis 還在伺服器上提供了不同的協定實作,因此您可以使用這些協定的各自用戶端。
-
AMQP
-
OpenWire
-
MQTT
-
STOMP
-
HornetQ (用於 HornetQ 用戶端)。
-
核心 (Artemis CORE 協定)
JMS 語意由客戶端的 JMS facade 層實現。
Apache ActiveMQ Artemis Broker 不使用 JMS,事實上也不了解 JMS 的任何資訊,它是一個與協定無關的訊息傳遞伺服器,旨在與多種不同的協定一起使用。
當使用者在客戶端使用 JMS API 時,所有 JMS 互動都會在透過核心協定進行傳輸之前,轉換為 Apache ActiveMQ Artemis 核心用戶端 API 的操作。
Broker 始終只處理核心 API 的互動。
2. 嵌入式 Broker
Apache ActiveMQ Artemis 核心設計為一組簡單的 POJO,因此如果您的應用程式需要在內部具有訊息傳遞功能,但您不想將其公開為 Apache ActiveMQ Artemis Broker,則可以直接在您自己的應用程式中實例化並嵌入 Broker。
閱讀更多關於嵌入 Apache ActiveMQ Artemis 的資訊。
3. 與 Java/Jakarta EE 應用程式伺服器整合
Apache ActiveMQ Artemis 提供了自己的功能完整的 Java 連接器架構 (JCA) 配接器,使其可以輕鬆整合到任何符合 Java/Jakarta EE(以下簡稱「EE」)的應用程式伺服器或 servlet 引擎中。
EE 應用程式伺服器提供了訊息驅動 Bean (MDB),這是一種特殊的 Enterprise Java Beans (EJB),可以處理來自 JMS 系統或郵件系統等來源的訊息。
MDB 最常見的用途可能是從 JMS 訊息傳遞系統接收訊息。
根據 EE 規範,應用程式伺服器使用 JCA 配接器與 JMS 訊息傳遞系統整合,以便它可以為 MDB 接收訊息。
但是,JCA 配接器不僅被 EE 應用程式伺服器用於透過 MDB 接收訊息,而且還在從 EJB 或 servlet 內部向 JMS 訊息傳遞系統傳送訊息時使用。
當從 EE 應用程式伺服器內部與 JMS 訊息傳遞系統整合時,始終建議透過 JCA 配接器完成。事實上,根據 EE 規範,在不使用 JCA 的情況下直接與 JMS 訊息傳遞系統通信是非法的。
應用程式伺服器的 JCA 服務提供了額外的功能,例如連線池和自動交易登記,這些功能在使用訊息傳遞時(例如從 EJB 內部)是理想的。 可以直接從 EJB、MDB 或 servlet 與 JMS 訊息傳遞系統對話,而無需經過 JCA 配接器,但不建議這樣做,因為您將無法利用 JCA 的功能(例如 JMS 會話的快取),這可能會導致效能不佳。
請注意,EJB 會話或實體 Bean 與訊息驅動 Bean 之間的所有通信都通過配接器進行,而不是直接到 Apache ActiveMQ Artemis。
帶有禁止符號的大箭頭顯示 EJB 會話 Bean 直接與 Apache ActiveMQ Artemis 伺服器對話。 不建議這樣做,因為您很可能每次都想要從 EJB 互動時建立新的連線和會話,這是一種反模式。