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

如何使用Amazon SNS Java SDK处理SNS推送通知?

解决方案

首先需要明确:你创建的PlatformEndpoint是用于对接移动推送服务(如APNS、FCM)的,SNS会将消息发送到这些移动平台服务,再由它们推送到终端设备。运行在EC2上的Java后端应用无法直接通过这类端点接收推送消息——这也是你在AmazonSNS客户端找不到接收方法的原因。

如果要让EC2上的Java应用接收SNS主题的消息,同时满足低成本、高免费额度的需求,最适合的方案是用SQS队列订阅SNS主题,然后通过Java代码轮询或监听SQS队列来处理消息。具体步骤如下:

1. 配置SQS与SNS的关联

  • 创建一个SQS队列(可通过AWS控制台或SDK操作)。
  • 将目标SNS主题订阅到该SQS队列(协议选择sqs,可通过控制台或SDK完成)。

2. Java代码实现消息接收与处理

使用AmazonSQS客户端轮询队列获取并处理SNS消息,示例代码如下:

import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.Message;
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

public class SnsMessageProcessor {
    private static final Logger log = LoggerFactory.getLogger(SnsMessageProcessor.class);
    private static final String SQS_QUEUE_URL = "你的SQS队列URL";

    public static void main(String[] args) {
        AmazonSQS sqsClient = AmazonSQSClientBuilder.defaultClient();
        ObjectMapper objectMapper = new ObjectMapper();

        // 配置长轮询,减少空请求次数,降低成本
        ReceiveMessageRequest receiveRequest = new ReceiveMessageRequest(SQS_QUEUE_URL)
                .withMaxNumberOfMessages(10)
                .withWaitTimeSeconds(20);

        while (true) {
            List<Message> messages = sqsClient.receiveMessage(receiveRequest).getMessages();
            for (Message msg : messages) {
                try {
                    // 解析SQS中的SNS消息结构(SNS推送到SQS的消息是JSON格式)
                    JsonNode rootNode = objectMapper.readTree(msg.getBody());
                    String actualMessageContent = rootNode.get("Message").asText();

                    // 编写你的业务处理逻辑
                    log.info("接收到SNS消息: {}", actualMessageContent);

                    // 处理完成后删除消息,避免重复消费
                    sqsClient.deleteMessage(SQS_QUEUE_URL, msg.getReceiptHandle());
                } catch (Exception e) {
                    log.error("消息处理失败", e);
                    // 可根据需求添加重试逻辑或配置死信队列
                }
            }
        }
    }
}

补充说明

  • SQS的长轮询机制(withWaitTimeSeconds)能有效减少无效请求,控制成本。
  • 消息处理完成后必须调用deleteMessage,否则消息会在可见性超时后重新进入队列,导致重复处理。
  • 如果需要更优雅的异步监听,可结合Spring Cloud AWS等框架的SQS消息监听器组件,无需手动实现轮询逻辑。

内容的提问来源于stack exchange,提问作者Maurice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:07:37