本文說明如何使用 Spring Cloud Azure 和 Spring Messaging Azure 服務總線。 Spring Framework 提供與傳訊系統整合的廣泛支援。
Spring Messaging Azure 服務匯流匝道
重要概念
Azure 服務匯流排是完全管理的企業訊息代理程式,提供訊息佇列和發佈/訂閱主題。 適用於 Azure 服務總線專案的 Spring Messaging 會將核心 Spring 概念套用至服務總線型傳訊解決方案的開發。 它會提供 範本 作為傳送訊息的高階抽象概念。 它也支援帶有 @ServiceBusListener 註解和 監聽器容器 的訊息驅動 POJO。 這些連結庫會提升相依性插入和宣告式組態的使用。 在這些情況下,您可以看到 Spring Framework 中的 JMS 支援和 Spring AMQP 中的 RabbitMQ 支援相似之處。
相依性設定
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter</artifactId>
</dependency>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-messaging-azure-servicebus</artifactId>
</dependency>
設定
此程式庫提供下列供 ServiceBusTemplate 和 @ServiceBusListener 使用的組態選項:
| 財產 | 類型 | 說明 |
|---|---|---|
spring.cloud.azure.message-converter.isolated-object-mapper |
布爾值 | 隔離的 ObjectMapper bean 是否用於服務總線訊息轉換器。 默認為啟用。 |
spring.cloud.azure.servicebus.enabled |
布爾值 | 是否啟用 Azure 服務總線。 |
spring.cloud.azure.servicebus.connection-string |
繩子 | 服務總線命名空間連接字串值。 |
spring.cloud.azure.servicebus.custom-endpoint-address |
繩子 | 連接到服務總線時要使用的自訂端點位址。 |
spring.cloud.azure.servicebus.namespace |
繩子 | 服務總線命名空間值,這是 FQDN 的前置詞。 FQDN 應該由 NamespaceName.DomainName 組成 |
spring.cloud.azure.servicebus.entity-type |
繩子 | Azure 服務總線的實體類型。 |
基本用法
自訂服務總線訊息轉換器
有兩種方式可以設定服務總線訊息轉換器:
設定下列屬性,讓預設的 服務匯流排 訊息轉換器使用
ObjectMapperBean;該 Bean 可以是您自訂的ObjectMapperBean,或是由 Spring Boot 管理的 Bean:spring: cloud: azure: message-converter: isolated-object-mapper: false直接定義服務總線訊息轉換器 Bean:
@Bean AzureMessageConverter<ServiceBusReceivedMessage, ServiceBusMessage> serviceBusMessageConverter() { JsonMapper jsonMapper = JsonMapper.builder().addModule(new JavaTimeModule()).build(); return new ServiceBusMessageConverter(jsonMapper); }
將訊息傳送至 Azure 服務總線
使用下列步驟來傳送訊息:
使用下列其中一種方法填入認證組態選項:
若使用
DefaultAzureCredential作為認證憑證,請在 application.yml 檔案中設定下列屬性:spring: cloud: azure: servicebus: namespace: ${AZURE_SERVICE_BUS_NAMESPACE} entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}針對認證作為連接字串,請在 application.yml 檔案中設定下列屬性:
spring: cloud: azure: servicebus: connection-string: ${AZURE_SERVICE_BUS_CONNECTION_STRING} entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}針對認證作為受控識別,請在 application.yml 檔案中設定下列屬性:
spring: cloud: azure: credential: managed-identity-enabled: true client-id: ${AZURE_CLIENT_ID} profile: tenant-id: <tenant> servicebus: namespace: ${AZURE_SERVICE_BUS_NAMESPACE} entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
備註
tenant-id允許下列值:common、organizations、consumers或租用戶標識符。 如需這些值的詳細資訊,請參閱 使用錯誤的端點(個人和組織帳戶)一節中的錯誤AADSTS50020 - 來自身分識別提供者的用戶帳戶不存在於租使用者。 如需轉換單一租使用者應用程式的資訊,請參閱 將單一租使用者應用程式轉換成多租使用者Microsoft Entra ID。
若使用服務主體認證,請在 application.yml 檔案中設定下列屬性:
spring: cloud: azure: credential: client-id: ${AZURE_CLIENT_ID} client-secret: ${AZURE_CLIENT_SECRET} profile: tenant-id: <tenant> servicebus: namespace: ${AZURE_SERVICE_BUS_NAMESPACE} entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
備註
tenant-id允許下列值:common、organizations、consumers或租用戶標識符。 如需這些值的詳細資訊,請參閱 使用錯誤的端點(個人和組織帳戶)一節中的錯誤AADSTS50020 - 來自身分識別提供者的用戶帳戶不存在於租使用者。 如需轉換單一租使用者應用程式的資訊,請參閱 將單一租使用者應用程式轉換成多租使用者Microsoft Entra ID。
ServiceBusTemplate會自動配置,您也可以如以下範例所示,將它直接自動裝配到您自己的 Bean 中:@Component public class MyBean { private final ServiceBusTemplate serviceBusTemplate; public MyBean(ServiceBusTemplate serviceBusTemplate) { this.serviceBusTemplate = serviceBusTemplate; } public void someMethod() { this.serviceBusTemplate.sendAsync('QUEUE_NAME', MessageBuilder.withPayload("Hello world").build()).subscribe(); } }
從 Azure 服務總線接收訊息
使用下列步驟來接收訊息:
填寫認證組態選項。
加入
@EnableAzureMessaging批註,這會觸發探索以@ServiceBusListener標註的方法,並在幕後建立訊息接聽器容器。@SpringBootApplication @EnableAzureMessaging public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }備註
為避免重複,自
5.21.0版起,Spring Cloud Azure 自動設定會自動啟用註解@EnableAzureMessaging。當 ServiceBus 基礎結構存在時,您可以標註任何具有
@ServiceBusListener的 Bean 來建立接聽程式端點。 下列元件會在QUEUE_NAME佇列上建立接聽程式端點:@Component public class MyBean { @ServiceBusListener(destination = "QUEUE_NAME") public void processMessage(String content) { // ... } }
自訂服務總線客戶端屬性
開發人員可以使用 AzureServiceClientBuilderCustomizer 來自定義服務總線用戶端屬性。 下列範例會自訂 sessionIdleTimeout中的 ServiceBusClientBuilder 屬性:
@Bean
public AzureServiceClientBuilderCustomizer<ServiceBusClientBuilder.ServiceBusSessionProcessorClientBuilder> customizeBuilder() {
return builder -> builder.sessionIdleTimeout(Duration.ofSeconds(10));
}
範例
欲了解更多資訊,請參閱 azure-spring-boot-samples GitHub 上的倉庫。