Aws Sqs Listener Spring boot实现

1、背景介绍

由于公司接入 aws sqs 消息队列,所以会涉及到从sqs拉取消息。本以为 aws 已经提供了类似 KafkaListener 一样的监听工具呢, 但是找了一遍,发现需要集成 spring-cloud-aws 才能使用,这很显然并不适合我们。因此决定手撸一个SqsListener !

2、Springboot 集成 SqsListener 示例

在spring boot 项目配置文件 application.yml内增加以下内容

duxinglangzi:
  queue:
    sqs:
      instances:
        defaults:               # 默认的,如果不设置,程序会将第一个设置为默认的
          region: us-west-1
          secret-access-key: Ya8raaaaaaaaaaaaaaaaaaaad8AjBii29x
          access-key-id: AKbbbHbbbbbbbUF27W
        second:                 # 第二个
          region: us-west-2
          secret-access-key: Ya8rccccccccccccccccccccd8AjBii29x
          access-key-id: AKIddddddddd7UF27W
        third:                  # 第三个
          region: us-east-1
          secret-access-key: Ya8reeeeeeeeeeeeeeeeeeeeeAjBii29x
          access-key-id: AKfffffffffffUF27W
wuqiong:
  sqs:
    url: https://sqs.us-west-1.amazonaws.com/1234567890/qiong-queue.fifo

在spring boot 项目中的代码使用实例 (需在使用EnableSqsListener 注解开启 sqs listener)



import com.duxinglangzi.sqs.starter.annotation.SqsListener;
import com.duxinglangzi.sqs.starter.container.QueueMessageAcknowledgment;
import com.duxinglangzi.sqs.starter.enums.MessageDeletionPolicy;
import org.springframework.beans.factory.annotation.Autowired;
import software.amazon.awssdk.services.sqs.model.Message;
import software.amazon.awssdk.services.sqs.model.SendMessageResponse;
import org.springframework.stereotype.Service;


@Service
@EnableSqsListener
public class SqsListenerTest {


    @Autowired
    private CustomSqsClient customSqsClient;

    /**
     * 示例1:  通过动态参数进行配置 listener, 且删除策略为: NEVER(手动确认并删除)
     *
     * @param message
     * @param acknowledgment
     * @return void
     * @author wuqiong 2022-06-28 17:28
     */
    @SqsListener(queueUrl = "${wuqiong.sqs.url}", deletionPolicy = MessageDeletionPolicy.NEVER)
    public void oneMessage(Message message, QueueMessageAcknowledgment acknowledgment) {
        System.out.println("[oneMessage] --->>> currentTimeMillis : " +
                System.currentTimeMillis() + "Fifo message body " + message.body());
        boolean acknowledge = acknowledgment.acknowledge(); // 手动删除消息
    }

    /**
     * 示例2:  通过指定队列地址, 且删除策略为默认的: SUCCESS , 此时方法无需参数 QueueMessageAcknowledgment
     *
     * @param message
     * @return void
     * @author wuqiong 2022-06-28 17:28
     */
    @SqsListener(queueUrl = "https://sqs.us-west-1.amazonaws.com/1234567890/qiong-queue.fifo")
    public void twoMessage(Message message) {
        System.out.println("[twoMessage] --->>> currentTimeMillis : " +
                System.currentTimeMillis() + "Fifo message body " + message.body());
    }

    /**
     * 示例3:  通过指定队列地址, 且删除策略为: ALWAYS(总是删除消息) , 此时方法无需参数 QueueMessageAcknowledgment
     *
     * @param message
     * @return void
     * @author wuqiong 2022-06-28 17:28
     */
    @SqsListener(queueUrl = "https://sqs.us-west-1.amazonaws.com/1234567890/qiong-queue.fifo", deletionPolicy = MessageDeletionPolicy.ALWAYS)
    public void threeMessage(Message message) {
        System.out.println("[threeMessage] --->>> currentTimeMillis : " +
                System.currentTimeMillis() + "Fifo message body " + message.body());
    }

    /**
     * 示例4:  发送一个消息到 sqs fifo 队列
     *
     * @return void
     * @author wuqiong 2022-06-28 17:28
     */
    public void fourMessage() {
        // second 对应着配置文件第二个
        customSqsClient.sentFifoMessage(
                "second",
                "https://sqs.us-west-1.amazonaws.com/1234567890/qiong-queue.fifo",
                "这是测试消息啊",
                "test-group-11111",
                "test-group",
                3,
                null);
    }

    /**
     * 示例5:  发送一个消息到 sqs standard 队列
     *
     * @return void
     * @author wuqiong 2022-06-28 17:28
     */
    public void fiveMessage() {
        // client name 不写, 默认使用配置文件里面的第一个
        SendMessageResponse sendMessageResponse = customSqsClient.sentStandardMessage(
                null,
                "https://sqs.us-west-1.amazonaws.com/1234567890/qiong-standard-queue",
                "这是测试消息啊",
                3,
                null);
        System.out.println(sendMessageResponse.messageId());
    }

}

3、源码地址

对于 sqs-spring-boot-starter 源代码为楼主自己封装, 地址: 大型全球交友平台地址 github
另附国内地址: Gitee

如果有需要的同学,可以自行下载源码进行修改和自定义封装.
本文使用 aws sqs 是 software.amazon.awssdk 下面的,因为aws sdk 分两种。 有需要的同学,可以自行选择使用。具体修改 MessageListenerContainer 实现即可。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值