本指南包含詳細資訊,可協助您成功使用 Java Message Service (JMS) 2.0 API 與 Azure 服務總線通訊。
身為 Java 開發人員,如果您不熟悉 Azure 服務總線,請考慮閱讀下列文章。
| 入門指南 | 概念 |
|---|---|
Java Message Service (JMS) 程式設計模型
Java Message Service API 程式設計模型如下列各節所示:
備註
Azure 服務總線進階層 支援 JMS 1.1 和 JMS 2.0。
Azure 服務總線 - 標準 層支援有限的 JMS 1.1 功能。 如需詳細資訊,請參閱此 檔。
JMS - 建置組塊
下列建置組塊可用來與 JMS 應用程式通訊。
連線中心
用戶端會使用連線處理站物件來與 JMS 提供者連線。 連接工廠會封裝由系統管理員定義的一組連接配置參數。
每個連接工廠都是 ConnectionFactory、QueueConnectionFactory 或 TopicConnectionFactory 介面的實例。
為了簡化與 Azure 服務總線的連線,這些介面會分別透過 ServiceBusJmsConnectionFactory、 ServiceBusJmsQueueConnectionFactory或 ServiceBusJmsTopicConnectionFactory 實作。
這很重要
利用 JMS 2.0 API 的 Java 應用程式可以使用連接字串連線到 Azure 服務總線,或使用 TokenCredential 來利用 Microsoft Entra 支援的驗證。 使用 Microsoft Entra 支援的驗證時,請務必視需要將角色和權限指派給 (部分內容可能是機器或 AI 翻譯) 身分識別。
在 Azure 上建立 系統指派的受控識別 ,並使用此身分識別來建立 TokenCredential。
TokenCredential tokenCredential = new DefaultAzureCredentialBuilder().build();
接著可以使用下列參數具現化連線處理站。
- 令牌認證 - 代表能夠提供 OAuth 令牌的認證。
- 主機 - Azure 服務總線進階層命名空間的主機名。
- ServiceBusJmsConnectionFactorySettings 屬性包,其中包含
- connectionIdleTimeoutMS - 閑置連線逾時,以毫秒為單位。
- traceFrames - 布爾值旗標,可收集AMQP追蹤框架以進行偵錯。
- 其他組態參數
可以按照此處所示來建立工廠。 令牌認證和主機是必要參數,但其他屬性是選擇性的。
String host = "<YourNamespaceName>.servicebus.windows.net";
ConnectionFactory factory = new ServiceBusJmsConnectionFactory(tokenCredential, host, null);
JMS 目的地
目的地是客戶端用來指定其產生的訊息目標以及其取用之訊息來源的物件。
目的地會對應至 Azure 服務匯流排中的實體 - 佇列 (在點對點傳送的使用情境下) 以及主題 (在發佈/訂閱的使用情境下)。
連結
連線會以 JMS 提供者封裝虛擬連線。 使用 Azure 服務匯流排,這代表了應用程式透過 AMQP 與 Azure 服務匯流排之間的具狀態連線。
從連線工廠建立連線,如下列範例所示:
Connection connection = factory.createConnection();
會議
工作階段是用於產生及取用訊息的單一執行緒內容。 它可以用來建立訊息、訊息生產者和消費者,但也提供交易上下文,以允許將傳送和接收分組到原子性工作單位。
您可以從連接物件建立連線會話,如下列範例所示:
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
備註
JMS API 不支援從已啟用訊息工作階段的服務匯流排佇列或主題接收訊息。
會話模式
您可以使用下列任何模式來建立工作階段。
| 會話模式 | 行為 |
|---|---|
| Session.AUTO_ACKNOWLEDGE | 當不論是工作階段成功地傳回了對於接收的呼叫,或是工作階段所呼叫,負責處理訊息的訊息接聽程式成功地傳回時,工作階段便會自動確認客戶端收到了一個訊息。 |
| Session.CLIENT_ACKNOWLEDGE | 用戶端會藉由呼叫訊息的確認方法,來確認已取用的訊息。 |
| Session.DUPS_OK_ACKNOWLEDGE | 此確認模式會指示工作階段延遲確認訊息的傳遞。 |
| Session.SESSION_TRANSACTED | 此值可作為引數傳遞至 Connection 物件上的 createSession(int sessionMode) 方法,以指定會話應使用本機交易。 |
未指定工作階段模式時,預設會選擇 Session.AUTO_ACKNOWLEDGE 。
JMSContext
備註
JMSContext 定義為 JMS 2.0 規格的一部分。
JMSContext 結合了連接和會話物件所提供的功能。 您可以從連線中心物件建立它。
JMSContext context = connectionFactory.createContext();
JMSCoNtext 模式
就像 Session 物件一樣,可以使用與 會話模式中所述的相同認可模式來建立 JMSContext。
JMSContext context = connectionFactory.createContext(JMSContext.AUTO_ACKNOWLEDGE);
未指定模式時,預設會挑選 JMSContext.AUTO_ACKNOWLEDGE 。
JMS 訊息產生者
訊息產生者是使用 JMSContext 或 Session 建立的物件,並用於將訊息傳送至目的地。
其可以建立為獨立物件,如下列範例所示:
JMSProducer producer = context.createProducer();
或者,在需要傳送訊息時於執行階段建立。
context.createProducer().send(destination, message);
JMS 訊息取用者
訊息取用者是 JMSContext 或 Session 所建立的物件,用於接收傳送至目的地的訊息。 您可以建立它,如下列範例所示:
JMSConsumer consumer = context.createConsumer(dest);
透過 receive() 方法同步接收
訊息取用者提供同步方式,透過 receive() 方法從目的地接收訊息。
如果未指定任何參數/逾時或指定了逾時為 '0',則取用者會無限期封鎖,除非訊息到達或連接中斷(以較早發生者為準)。
Message m = consumer.receive();
Message m = consumer.receive(0);
提供非零正自變數時,取用者會封鎖直到該定時器到期為止。
Message m = consumer.receive(1000); // time out after one second.
使用 JMS 訊息接聽程式進行異步接收
訊息接聽程式是對象,用於在目的地上異步處理訊息。 它會實作 MessageListener 介面,該介面包含 onMessage 方法,特定的商業邏輯必須存在於此方法中。
必須使用 setMessageListener 方法,針對特定訊息使用者具現化並註冊訊息監聽器物件。
Listener myListener = new Listener();
consumer.setMessageListener(myListener);
從主題取用
JMS 訊息取用者會針對目的地建立,此目的地可以是佇列或主題。
佇列上的取用者只是位於用戶端應用程式與 Azure 服務匯流排之間工作階段 (和連線) 內容的用戶端物件。
但是主題上的取用者則分為 2 個部分 -
- 位於工作階段 (或 JMSCoNtext) 中的用戶端物件,以及
- 位於 Azure 服務匯流排上的訂用帳戶實體。
訂閱記載 於此處,且可以是以下其中之一:
- 共用永久性訂閱
- 共用非永久性訂閱
- 非共用永久性訂閱
- 非共用非永久性訂閱
JMS 佇列瀏覽器
JMS API 提供 QueueBrowser 物件,可讓應用程式瀏覽佇列中的訊息,並顯示每個訊息的標頭值。
您可以使用 JMSContext 建立佇列瀏覽器,如下列範例所示:
QueueBrowser browser = context.createBrowser(queue);
備註
JMS API 不提供用來瀏覽主題的 API。
這是因為主題本身不會儲存訊息。 一旦訊息傳送至主題,就會轉送至適當的訂用帳戶。
JMS 訊息選取器
訊息選取器可藉由接收應用程式來篩選收到的訊息。 使用訊息選取器時,接收的應用程式會將篩選訊息的工作卸除給 JMS 提供者(在此案例中為 Azure 服務總線),而不是自行承擔該責任。
建立下列任一取用者時,即可以使用選取器 -
- 共享持久訂閱
- 未共用的永久性訂用帳戶
- 共用的非永久性訂用帳戶
- 未共用的非永久性訂用帳戶
- 佇列取用者
- 佇列瀏覽器
備註
服務總線選取器不支援 「LIKE」 和 「BETWEEN」 SQL 關鍵詞。
AMQP 配置和服務匯流排作業對應
以下是 AMQP 配置轉譯為服務匯流排作業的方式:
ACCEPTED = 1; -> Complete()
REJECTED = 2; -> DeadLetter()
RELEASED = 3; (just unlock the message in service bus, will then get redelivered)
MODIFIED_FAILED = 4; -> Abandon() which increases delivery count
MODIFIED_FAILED_UNDELIVERABLE = 5; -> Defer()
總結
此開發人員指南示範如何使用Java Message Service (JMS) 的 Java 用戶端應用程式與 Azure 服務總線連線。
後續步驟
如需 Azure 服務總線的詳細資訊,以及 Java Message Service (JMS) 實體的詳細數據,請參閱下列文章: