Spring Cloud AWS – 消息支持

2023/05/13

1. AWS消息传递支持

1.1 SQS(简单队列服务)

我们可以使用QueueMessagingTemplate将消息发送到SQS队列。

要创建这个bean,我们可以使用AmazonSQSAsync客户端,当使用Spring Boot启动器时,它在应用程序上下文中默认可用:

@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);
}

由于Amazon 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向主题发布消息。

要创建它,我们需要一个AmazonSNS客户端:

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

然后,我们可以向主题发送通知:

@Autowired
NotificationMessagingTemplate messagingTemplate;

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

在AWS支持的多个SNS端点-SQS、HTTP(S)、电子邮件和SMS中,该项目仅支持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) {
        // handle message
    }

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

我们需要将主题名称添加到控制器级别的@RequestMapping注解中。此控制器启用HTTP(s)端点–/topic-subscriber,SNS主题使用它来创建订阅。

例如,我们可以通过调用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 Messaging的支持-这是关于Spring Cloud和AWS的快速系列文章的总结。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章