You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 03:27:00