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
实现即可。