如何使用Micronaut与Kotlin向AWS SNS主题发布消息
后续操作步骤
- 补充Netty异步客户端依赖:你倾向使用Netty的话不需要使用URLConnection,只需在构建配置中新增
software.amazon.awssdk:netty-nio-client依赖即可,Micronaut会自动将其配置为SNS异步客户端的底层传输层,无需手动绑定。 - 直接注入SNS异步客户端:你已经完成基础配置和依赖引入,Micronaut会自动托管
SnsAsyncClient类型的Bean,无需自行调用Builder创建客户端实例,直接在业务类中注入即可使用。 - 序列化待发送的对象列表:SNS消息仅支持字符串格式,你可以使用Micronaut默认集成的Jackson
ObjectMapper将对象列表序列化为JSON字符串作为消息内容。 - 构造请求执行异步发布:构建
PublishRequest对象指定主题ARN、消息内容等参数,调用SnsAsyncClient.publish()方法即可发起异步调用,返回的CompletableFuture可用来处理发布结果或异常。
Kotlin实现示例
首先是构建配置补充:
// build.gradle.kts 依赖配置 dependencies { // 你已添加的基础依赖 implementation("io.micronaut.aws:micronaut-aws-sdk-v2") implementation("software.amazon.awssdk:sns") // 新增Netty异步HTTP客户端依赖 implementation("software.amazon.awssdk:netty-nio-client") // 若项目未默认集成Jackson,补充该依赖做序列化 implementation("io.micronaut.jackson:micronaut-jackson-databind") }
业务服务实现示例:
import com.fasterxml.jackson.databind.ObjectMapper import jakarta.inject.Singleton import software.amazon.awssdk.services.sns.SnsAsyncClient import software.amazon.awssdk.services.sns.model.PublishRequest import java.util.concurrent.CompletableFuture // 自定义待发送的业务对象示例 data class OrderInfo(val orderId: String, val amount: Int, val userId: Long) @Singleton class SnsPublishService( // 注入Micronaut自动初始化的SNS异步客户端和Jackson序列化器 private val snsAsyncClient: SnsAsyncClient, private val objectMapper: ObjectMapper ) { /** * 异步发送对象列表到指定SNS主题 * @param topicArn 目标SNS主题的ARN * @param orderList 待发送的订单对象列表 * @return CompletableFuture 携带发布成功的消息ID */ fun publishOrderList(topicArn: String, orderList: List<OrderInfo>): CompletableFuture<String> { // 序列化对象列表为JSON字符串 val message = objectMapper.writeValueAsString(orderList) // 构建发布请求 val request = PublishRequest.builder() .topicArn(topicArn) .message(message) // 可选配置:消息属性、FIFO主题的消息组ID、去重ID等 .build() // 执行异步发布 return snsAsyncClient.publish(request).thenApply { publishResponse -> publishResponse.messageId() } } }
注意事项
- 无特殊自定义需求时不需要手动操作
SnsAsyncClientBuilder,Micronaut会自动读取application.yml中的密钥、地域等配置完成客户端初始化 - URLConnection是同步HTTP客户端,不匹配异步调用场景,使用Netty异步客户端可以更好的适配Micronaut的异步/响应式编程模型,性能表现更优
- SNS单条消息最大支持256KB,若消息体积超出该限制需要配合S3存储大消息内容,使用SNS的大消息扩展功能发送
内容的提问来源于stack exchange,提问作者yokodev
相关产品推荐
相关产品推荐

