1. AWS 消息支持

1.1. SQS (简单队列服务)

使用 QueueMessagingTemplate 可以轻松发送消息到 SQS 队列。通过 Spring Boot 自动配置的 AmazonSQSAsync 客户端就能创建这个模板:

@Bean
public QueueMessagingTemplate queueMessagingTemplate(
  AmazonSQSAsync amazonSQSAsync) {
    return new QueueMessagingTemplate(amazonSQSAsync);
}

发送消息时直接调用 convertAndSend() 方法:

@Autowired
QueueMessagingTemplate messagingTemplate;
 
public void send(String topicName, Object message) {
    messagingTemplate.convertAndSend(topicName, message);
}

⚠️ 由于 SQS 只接收字符串载荷,Java 对象会被自动序列化为 JSON。

使用 @SqsListener 注解配置消息监听器:

@SqsListener("spring-cloud-test-queue")
public void receiveMessage(String message, 
  @Header("SenderId") String senderId) {
    // 处理消息逻辑
}

这个方法会持续接收来自 spring-cloud-test-queue 的消息。通过 @Header 注解还能获取消息头信息。

✅ 如果第一个参数是自定义 Java 对象而非 String,Spring 会自动完成 JSON 反序列化。

1.2. SNS (简单通知服务)

与 SQS 类似,使用 NotificationMessagingTemplate 发布主题消息:

@Bean
public NotificationMessagingTemplate notificationMessagingTemplate(
  AmazonSNS amazonSNS) {
    return new NotificationMessagingTemplate(amazonSNS);
}

发送通知到主题:

@Autowired
NotificationMessagingTemplate messagingTemplate;

public void send(Object message, String subject) {
    messagingTemplate
      .sendNotification("spring-cloud-test-topic", message, subject);
}

重要提醒:虽然 AWS SNS 支持 SQS、HTTP(S)、邮件和短信等多种终端,但 Spring Cloud AWS 项目仅支持 HTTP(S) 接口。

在 MVC 控制器中配置终端:

@Controller
@RequestMapping("/topic-subscriber")
public class SNSEndpointController {

    @NotificationSubscriptionMapping
    public void confirmUnsubscribeMessage(
      NotificationStatus notificationStatus) {
        notificationStatus.confirmSubscription();
    }
 
    @NotificationMessageMapping
    public void receiveNotification(@NotificationMessage String message, 
      @NotificationSubject String subject) {
        // 处理通知逻辑
    }

    @NotificationUnsubscribeConfirmationMapping
    public void confirmSubscriptionMessage(
      NotificationStatus notificationStatus) {
        notificationStatus.confirmSubscription();
    }
}

⚠️ 关键点:必须在控制器级别的 @RequestMapping 注解中指定订阅路径(如 /topic-subscriber)。这个路径就是 SNS 主题创建订阅时使用的 URL。

例如,通过以下 URL 订阅主题:

https://host:port/topic-subscriber/

请求头决定调用方法

  • x-amz-sns-message-type=SubscriptionConfirmation → 触发 @NotificationSubscriptionMapping 方法(确认新订阅)
  • x-amz-sns-message-type=Notification → 触发 @NotificationMessageMapping 方法(处理通知)
  • x-amz-sns-message-type=UnsubscribeConfirmation → 触发 @NotificationUnsubscribeConfirmationMapping 方法(确认退订)

⚠️ 注意:@RequestMapping 的值与订阅的主题名称无关。

2. 总结

本文深入探讨了 Spring Cloud 对 AWS 消息服务的支持,至此我们完成了 Spring Cloud AWS 系列的全部内容。所有示例代码已上传至 GitHub 仓库


原始标题:Spring Cloud AWS – Messaging Support