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 仓库。