Apache ActiveMQ Artemis core 是一個具有自己 API 的訊息系統。我們稱之為 core API。
如果您不想使用 JMS API 或任何其他支援的協定,您可以直接使用 core API。core API 提供了 JMS 的所有功能,但沒有那麼複雜。它還提供了使用 JMS 無法實現的功能。
1. Core 訊息概念
一些 core 訊息概念與 JMS 概念相似,但 core 訊息概念在某些方面也有所不同。一般來說,core API 比 JMS API 更簡單,因為我們消除了佇列、主題和訂閱之間的區別。我們將依次討論每個主要的 core 訊息概念,但要詳細了解 API,請查閱 Javadoc。
另請參閱 地址模型 章節,以了解這些概念的高階概述以及組態詳細資訊。
1.1. 訊息 (Message)
-
訊息是在用戶端和伺服器之間傳送的資料單元。
-
訊息有一個本文,它是一個緩衝區,其中包含用於讀取和寫入資料的便捷方法。
-
訊息有一組屬性,這些屬性是鍵值對。每個屬性鍵都是字串,屬性值可以是整數、長整數、短整數、位元組、位元組陣列、字串、雙精度浮點數、浮點數或布林值類型。
-
訊息具有要傳送到的位址。當訊息到達伺服器時,它會被路由到繫結到該位址的任何佇列。路由語義(即單播或多播)由位址和佇列的「路由類型」決定。如果佇列以任何篩選器繫結,則只有在篩選器符合時,訊息才會路由到該佇列。一個位址可以繫結多個佇列,甚至可以不繫結任何佇列。也可能有佇列以外的實體(例如轉發)繫結到位址。
-
訊息可以是持久的或非持久的。持久佇列中的持久訊息將在伺服器崩潰或重新啟動後仍然存在。非持久訊息永遠不會在伺服器崩潰或重新啟動後仍然存在。
-
訊息可以指定 0 到 9 之間的優先順序值。0 表示最低優先順序,9 表示最高優先順序。代理程式將嘗試先傳遞較高優先順序的訊息,然後再傳遞較低優先順序的訊息。
-
訊息可以指定可選的過期時間。代理程式將不會傳遞超過其過期時間的訊息。
-
訊息還具有一個可選的時間戳記,表示訊息傳送的時間。
-
Apache ActiveMQ Artemis 也支援傳送/使用比任何時候可用 RAM 容量大得多的超大型訊息。
2. Core API
2.1. ServerLocator
用戶端使用 ServerLocator
執行個體來建立 ClientSessionFactory
執行個體。ServerLocator
執行個體用於定位伺服器並建立與伺服器的連線。
在 JMS 術語中,將 ServerLocator
視為與 JMS 連線工廠相同的方式。
ServerLocator
執行個體是使用 ActiveMQClient
工廠類別建立的。
2.2. ClientSessionFactory
用戶端使用 ClientSessionFactory
執行個體來建立 ClientSession
執行個體。ClientSessionFactory
執行個體基本上是與伺服器的連線
在 JMS 術語中,將它們視為 JMS 連線。
ClientSessionFactory
執行個體是使用 ServerLocator
類別建立的。
2.3. ClientSession
用戶端使用 ClientSession
來使用和產生訊息,並將它們分組到交易中。ClientSession
執行個體可以支援交易性和非交易性語義,並提供 XAResource
介面,以便可以將訊息操作作為 JTA 交易的一部分執行。
ClientSession
執行個體會將 ClientConsumer
執行個體和 ClientProducer
執行個體分組。
ClientSession
執行個體可以向可選的 SendAcknowledgementHandler
註冊。這允許您的用戶端程式碼在已傳送的訊息成功到達伺服器時以非同步方式收到通知。此獨特的 Apache ActiveMQ Artemis 功能可讓您完全保證已傳送的訊息已到達伺服器,而無需在每個傳送的訊息上封鎖,直到收到回應。封鎖每個傳送的訊息的成本很高,因為每個傳送的訊息都需要網路往返。透過不封鎖並以非同步方式接收傳送確認,您可以建立真正的端對端非同步系統,而這是使用標準 JMS API 無法實現的。如需此進階功能的詳細資訊,請參閱 傳送和提交保證 章節。
2.3.1. 識別您的用戶端應用程式以進行管理和除錯
將 ID 指派給您的 core 工作階段可以協助您使用 管理主控台 進行監控和除錯,例如:
ServerLocator locator = ...
ClientSessionFactory csf = createSessionFactory(locator);
ClientSession session = csf.createSession(null, null, false, true, true, locator.isPreAcknowledge(), locator.getAckBatchSize(), "my-client-id");
然後,值 my-client-id
將出現在「連線」、「取用者」和「產生者」索引標籤下的「用戶端 ID」欄中。
如果您使用的是 JMS API,則 setClientID
會產生相同的效果。
2.4. ClientConsumer
用戶端使用 ClientConsumer
執行個體從佇列中使用訊息。Core 訊息傳遞支援同步和非同步訊息使用語義。ClientConsumer
執行個體可以使用可選的篩選器運算式來設定,並且只會使用符合該運算式的訊息。
2.5. ClientProducer
用戶端在 ClientSession
執行個體上建立 ClientProducer
執行個體,以便可以傳送訊息。ClientProducer
執行個體可以指定所有傳送的訊息路由到的位址,或者它們可以沒有指定的位址,並且位址是在訊息的傳送時間指定的。
請注意, 為您產生或使用的每個訊息建立新的 |
3. 使用 Core 的簡單範例
以下是一個非常簡單的程式,使用 core 訊息 API 來傳送和接收訊息。在邏輯上,它由兩部分組成:首先設定生產者將訊息寫入位址,然後使用單播路由為取用者建立佇列、建立取用者,並啟動它。
ServerLocator locator = ActiveMQClient.createServerLocator("vm://0");
// In this simple example, we just use one session for both producing and receiving
ClientSessionFactory factory = locator.createSessionFactory();
ClientSession session = factory.createSession();
// A producer is associated with an address ...
ClientProducer producer = session.createProducer("example");
ClientMessage message = session.createMessage(true);
message.getBodyBuffer().writeString("Hello");
// We need a queue attached to the address ...
session.createQueue("example", RoutingType.ANYCAST, "example", true);
// And a consumer attached to the queue ...
ClientConsumer consumer = session.createConsumer("example");
// Once we have a queue, we can send the message ...
producer.send(message);
// We need to start the session before we can -receive- messages ...
session.start();
ClientMessage msgReceived = consumer.receive();
System.out.println("message = " + msgReceived.getBodyBuffer().readString());
session.close();