使用 Spring 中的 JMS 访问 Azure 服务总线
本教程演示如何使用适用于 Azure 服务总线 JMS 的 Spring Boot Starter 向服务总线 queues
和 topics
发送消息和从服务总线接收消息。
Azure 提供了一个异步消息平台,称为 Azure 服务总线(“服务总线”),该平台基于高级消息队列协议 1.0(“AMQP 1.0”)标准。 可以在一系列受支持的 Azure 平台上使用服务总线。
适用于 Azure 服务总线 JMS 的 Spring Boot Starter 提供 Spring JMS 与服务总线的集成。
以下视频介绍如何使用 JMS 2.0 将 Spring JMS 应用程序与 Azure 服务总线集成。
在本教程中,我们介绍两种身份验证方法:Microsoft Entra 身份验证和共享访问签名 (SAS) 身份验证。 无密码选项卡显示 Microsoft Entra 身份验证,连接字符串选项卡显示 SAS 身份验证。
Microsoft Entra 身份验证是一种使用 Microsoft Entra ID 中定义的标识连接到 Azure 服务总线 JMS 的机制。 通过 Microsoft Entra 身份验证,可以在一个中心位置集中管理数据库用户标识和其他 Microsoft 服务,从而简化权限管理。
SAS 身份验证使用 Azure 服务总线命名空间的连接字符串来委派对服务总线 JMS 的访问。 如果选择使用共享访问签名作为凭据,则需要自行管理连接字符串。
先决条件
Azure 订阅 - 免费创建订阅。
Java 开发工具包 (JDK) 版本 8 或更高版本。
Apache Maven 版本 3.2 或更高版本。
Azure 服务总线的队列或主题。 如果没有,请参阅使用 Azure 门户创建服务总线命名空间和队列或使用 Azure 门户创建服务总线主题和该主题的订阅。
Spring Boot 应用程序。 如果没有,请使用 Spring Initializr 创建一个 Maven 项目。 请务必选择 Maven 项目,并在依赖项下添加 Spring Web 依赖项,然后选择 Java 版本 8 或更高版本。
重要
要完成本教程中的步骤,需要 Spring Boot 版本 2.5 或更高版本。
从 Azure 服务总线发送和接收消息
使用 Azure 服务总线的队列或主题,可以使用 Spring Cloud Azure 服务总线 JMS 发送和接收消息。
要安装 Spring Cloud Azure Service Bus JMS Starter 模块,请将以下依赖项添加到 pom.xml 文件:
Spring Cloud Azure 物料清单 (BOM):
<dependencyManagement> <dependencies> <dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-dependencies</artifactId> <version>5.18.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
注意
如果使用 Spring Boot 2.x,请确保将
spring-cloud-azure-dependencies
版本设置为4.19.0
。 此物料清单 (BOM) 应在 pom.xml 文件的<dependencyManagement>
部分进行配置。 这可确保所有 Spring Cloud Azure 依赖项都使用相同的版本。 有关用于此 BOM 的版本的详细信息,请参阅应使用哪个版本的 Spring Cloud Azure。Spring Cloud Azure Service Bus JMS Starter 项目:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-servicebus-jms</artifactId> </dependency>
编写应用程序代码
使用以下步骤配置应用程序,使其使用服务总线队列或主题来发送和接收消息。
通过将以下属性添加到 application.properties 文件来配置服务总线凭据。
注意
Azure 服务总线 JMS 支持使用 Microsoft Entra ID 授权对服务总线资源的请求。 借助 Microsoft Entra ID,可使用 Azure 基于角色的访问控制 (Azure RBAC) 授予对安全主体的访问权限,该安全主体可能是用户或应用程序服务主体。
重要
在开始之前,请确保已将 Azure 服务总线数据所有者角色分配给当前使用的 Microsoft Entra 帐户。 有关详细信息,请参阅使用 Azure 门户分配 Azure 角色。
spring.jms.servicebus.namespace=<ServiceBusNamespace> spring.jms.servicebus.pricing-tier=<ServiceBusPricingTier> spring.jms.servicebus.passwordless-enabled=true spring.jms.listener.receive-timeout=60000
下表描述了配置中的字段:
字段 说明 spring.jms.servicebus.namespace
指定从 Azure 门户在服务总线服务实例中获取的命名空间。 spring.jms.servicebus.pricing-tier
指定服务总线的定价层。 支持的值为高级和标准。 高级层使用 Java 消息服务 (JMS) 2.0,而标准层使用 JMS 1.1 与 Azure 服务总线交互。 spring.jms.servicebus.passwordless-enabled
指定是否使用无密码。 spring.jms.listener.receive-timeout
默认情况下,接收超时值为 1000。 我们建议继续将其设置为 60000 添加
@EnableJms
以启用对 JMS 侦听器批注终结点的支持。 使用JmsTemplate
发送消息,使用@JmsListener
接收消息,如下例所示:import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.jms.annotation.EnableJms; import org.springframework.boot.CommandLineRunner; import org.springframework.jms.annotation.JmsListener; import org.springframework.jms.core.JmsTemplate; @SpringBootApplication @EnableJms public class ServiceBusJMSQueueApplication implements CommandLineRunner { private static final Logger LOGGER = LoggerFactory.getLogger(ServiceBusJMSQueueApplication.class); private static final String QUEUE_NAME = "<QueueName>"; @Autowired private JmsTemplate jmsTemplate; public static void main(String[] args) { SpringApplication.run(ServiceBusJMSQueueApplication.class, args); } @Override public void run(String... args) { LOGGER.info("Sending message"); jmsTemplate.convertAndSend(QUEUE_NAME, "Hello World"); } @JmsListener(destination = QUEUE_NAME, containerFactory = "jmsListenerContainerFactory") public void receiveMessage(String message) { LOGGER.info("Message received: {}", message); } }
将
<QueueName>
替换为在服务总线命名空间中配置的你自己的队列名称。提示
在本教程中,配置或代码中没有身份验证操作。 但连接到 Azure 服务需要进行身份验证。 要完成身份验证,需要使用 Azure 标识。 Spring Cloud Azure 使用 Azure 标识库提供的
DefaultAzureCredential
来帮助获取凭据,而无需更改任何代码。DefaultAzureCredential
支持多种身份验证方法,并确定应在运行时使用哪种方法。 通过这种方法,你的应用可在不同环境(例如本地与生产环境)中使用不同的身份验证方法,而无需实现特定于环境的代码。 有关详细信息,请参阅 DefaultAzureCredential。若要在本地开发环境中完成身份验证,可以使用 Azure CLI、Visual Studio Code、PowerShell 或其他方法。 有关详细信息,请参阅 Java 开发环境中的 Azure 身份验证。 若要在 Azure 托管环境中完成身份验证,建议使用用户分配的托管标识。 有关详细信息,请参阅什么是 Azure 资源的托管标识?
启动应用程序。 应会看到
Sending message
和Hello World
发布到应用程序日志,如以下示例输出中所示:Sending message Message received: Hello World
部署到 Azure Spring Apps
现在,你已在本地运行 Spring Boot 应用程序,是时候将其转移到生产环境了。 借助 Azure Spring Apps,可以轻松地将 Spring Boot 应用程序部署到 Azure,不需更改任何代码。 该服务管理 Spring 应用程序的基础结构,让开发人员可以专注于代码。 Azure Spring Apps 可以通过以下方法提供生命周期管理:综合性监视和诊断、配置管理、服务发现、CI/CD 集成、蓝绿部署等。 若要将应用程序部署到 Azure Spring Apps,请参阅在 Azure Spring Apps 中部署你的第一个应用程序。