对接Amazon SQS 队列相关接口简要说明

Amazon SQS 队列相关接口

因项目功能需求,对接了Amazon的SQS消息队列,封装了常用的接口,本文是对封装后接口的简要说明。


1.创建队列

2个创建标准队列的接口,和2个创建FIFO(first in first out :先进先出)队列的接口。
队列的很多功能需要通过属性进行配置,可以在创建队列时通过参数attributes进行配置,也可以在创建队列以后单独配置,后面会详细介绍设置队列属性的接口,以及对属性封装后的各个功能配置接口。

/**
* 2个创建标准队列的接口
* 
* @param queueName - 队列名称,必填
* @param attributes - 队列属性集合,非必填
* @param tags - 队列标签集合,非必填
* @return 队列url
*/
String createQueue(String queueName)

String createQueue(String queueName, Map<QueueAttributeNameEnum, String> attributes, Map<String, String> tags)

/**
 * 2个创建FIFO队列的接口
 * 
 * @param queueName - 队列名称,必填
 * @param delaySeconds - 延迟传递到队列的时间,非必填
 * @param attributes - 队列属性集合,非必填
 * @param tags - 队列标签集合,非必填
 * @return 队列url
*/
String createFifoQueue(String queueName, Integer delaySeconds)

String createFifoQueue(String queueName, Map<QueueAttributeNameEnum, String> attributes, Map<String, String> tags)

注:

  • 队列创建以后不能在标准队列与FIFO队列之间转换(即一个标准队列不能转为FIFO队列,一个FIFO队列也不能转为标准队列),下面说明原因。
  • FIFO队列的名称必须以 .fifo 结尾,否则会报错。
  • 参数 - 延迟传递到队列的时间:有效值 0到 900(15分钟)之间的整数,默认 0,单位秒。
  • FIFO队列不能针对队列中的每条message单独设置 delaySeconds ,FIFO队列若要设置 delaySeconds ,只能在队列参数中统一设置。

实际上在创建队列时,是通过FIFO_QUEUE属性的值来确定创建的队列是标准队列还是FIFO队列。
当FIFO_QUEUE属性的值为 true 时,创建FIFO队列。
当FIFO_QUEUE属性的值为 false ,或者不设置FIFO_QUEUE属性(默认false)时,创建标准队列。
队列创建后,无法改变FIFO_QUEUE属性的值,所以队列创建以后不能在标准队列与FIFO队列之间转换。


2.获取队列url

队列的url相当于一个队列的唯一标识符,队列创建成功后会返回该队列的url,后续对该队列的操作都需要队列url作为参数。

/**
 * 根据队列名称获取该队列的url
 * 
 * @param queueName - 队列名称,必填
 * @param queueOwnerAWSAccountId - AWS帐号id,非必填
 * @return 队列url
*/
String getQueueUrl(String queueName)

String getQueueUrl(String queueName, String queueOwnerAWSAccountId)

注:

  • 若不存在指定名称的队列,则抛出异常提示QueueDoesNotExistException: The specified queue does not exist for this wsdl version.
  • 可通过参数 queueOwnerAWSAccountId 传入AWS帐号id,查询指定的另一个AWS帐号的队列,不传则查询当前AWS帐号所属的队列。

3.1.设置队列属性

可通过修改队列的属性值,改变队列的配置以及开启或关闭队列的某些功能。

/**
 * 修改队列属性
 * 
 * @param queueUrl - 队列url,必填
 * @param attributes - 属性-属性值集合,必填
*/
void setQueueAttributes(String queueUrl, Map<QueueAttributeNameEnum, String> attributes)

注:

  • 不是所有属性都可以修改。
  • 部分属性的属性值存在有效值范围。
  • 队列属性说明详见官方文档,或总结博文

3.2.封装特定属性后的功能接口

以下是针对队列的特定配置、功能进行属性封装后的接口。将属性封装到接口中,调用者就只需传入属性值,而不需要再去考虑应该修改哪些属性,同时也可避免拼写错误等低级错误。

3.2.1.设置队列交付延迟时间

设置队列中所有消息延迟传递的时间长度。例如,延迟时间设置为1分钟,则消息发送到队列后1分钟内为不可用状态,对消费者不可见,1分钟后才变为可用状态,才对消费者可见。

/**
 * 设置队列交付延迟时间
 * 
 * @param queueName - 队列名称,必填
 * @param queueUrl - 队列url,必填
 * @param delaySeconds - 延迟时间(有效值:0 到 900(15分钟),单位秒),必填
*/
void setDelaySecondsByName(String queueName, Integer delaySeconds)

void setDelaySecondsByUrl(String queueUrl, Integer delaySeconds)

注:

  • 若创建队列时没有设置,则初始默认为0秒。
  • setDelaySecondsByName接口其实是对setDelaySecondsByUrl接口进行了一层封装,首先要通过queueName获取queueUrl,所以setDelaySecondsByUrl接口的效率更高。

3.2.2.设置队列的消息保留周期

设置队列中消息的保留周期。例如,保留周期设置为60秒,则60秒后消息自动删除。

/**
 * 设置队列的消息保留周期
 * 
 * @param queueUrl - 队列url,必填
 * @param retentionPeriod - 消息保留周期(有效值:60(1分钟)到 1209600(14天),默认值345600(4天),单位秒),非必填
*/
void setMessageRetentionPeriod(String queueUrl, Integer retentionPeriod)

注:

  • 若创建队列时没有设置,则初始默认为4天。

3.2.3.设置队列的等待消息到达的时长

设置获取消息请求的等待时间。若值为0,则请求为短轮询;若值大于0,则开启长轮询。

/**
 * 设置队列的等待消息到达的时长
 * 
 * @param queueUrl - 队列url,必填
 * @param waitTimeSeconds - 等待消息到达的时长(有效值:0 到 20,默认0,单位秒),非必填
*/
void setReceiveMessageWaitTimeSeconds(String queueUrl, Integer waitTimeSeconds)

注:

  • 若创建队列时没有设置,则初始默认为0秒(短轮询)。
  • 队列的配置优先级低于获取消息ReceiveMessage接口的WaitTimeSeconds参数。
  • 长轮询与短轮询详见官方文档

3.2.4.设置队列中消息可见性超时时长

队列级别的消息可见性超时时长,以秒为单位。一条消息被某一消费者接收后,在可见性超时时间之内,这条消息对其他消费者不可见。

/**
 * 设置队列中消息可见性超时时长
 * 
 * @param queueUrl - 队列url,必填
 * @param timeoutSeconds- 可见性超时时长(有效值:0 到 43200,单位秒,默认30),非必填
*/
void setVisibilityTimeout(String queueUrl, Integer timeoutSeconds)

注:

  • 若调用消息接口changeMessageVisibility修改某条消息的可见性超时时长,修改会立即生效,但是若消息被消费者接收后没有删除,则该消息下一次被消费者接收时,可见性超时时长将恢复为原始值。

3.2.5.为源队列配置死信队列

若为源队列配置了死信队列,则源队列中无法成功处理(使用)的消息将会移入死信队列。

/**
 * 为源队列配置死信队列
 * 
 * @param queueName - 队列名称,必填
 * @param queueUrl - 队列url,必填
 * @param maxReceiveCount - 消息最大接收次数,非必填
*/
void deployDeadLetterQueueByName(String sourceQueueName, String deadLetterQueueName, Integer maxReceiveCount)

void deployDeadLetterQueueByUrl(String sourceQueueUrl, String deadLetterQueueUrl, Integer maxReceiveCount)

注:

  • 源队列与死信队列的类型必须一致:标准源队列的死信队列必须是标准队列,FIFO源队列的死信队列必须是FIFO队列。
  • 参数 - maxReceiveCount 消息最大接收次数(不传参则默认为5),消息超过最大接收次数且未被删除,则将消息从源队列移至死信队列。
  • 源队列与死信队列的关系为多对一,即一个源队列只能有一个死信队列,一个死信队列可以被多个源队列配置。

3.2.6.启用(消息组 级别)基于内容的重复数据删除

*仅适用于FIFO(先进先出)队列
与标准队列不同,FIFO队列不会引入重复消息,“消息组级别”即判断消息是否重复的范围为同属于一个消息组的所有消息。
启用基于内容的重复数据删除。这会指示 Amazon SQS 使用 SHA-256 哈希值来生成消息重复数据删除 ID,使用消息的正文而不是消息的属性。

/**
 * 启用(消息组 级别)基于内容的重复数据删除功能
 * 
 * @param queueUrl - 队列url,必填
*/
void enableContentBasedDeduplication4MessageGroup(String queueUrl)

注:

3.2.7.启用(队列 级别)基于内容的重复数据删除

*仅适用于FIFO(先进先出)队列
与标准队列不同,FIFO队列不会引入重复消息,“队列级别”即判断消息是否重复的范围为同属于一个队列的所有消息。
启用基于内容的重复数据删除。这会指示 Amazon SQS 使用 SHA-256 哈希值来生成消息重复数据删除 ID,使用消息的正文而不是消息的属性。

/**
 * 启用(队列 级别)基于内容的重复数据删除功能
 * 
 * @param queueUrl - 队列url,必填
*/
void enableContentBasedDeduplication4Queue(String queueUrl)

注:

3.2.8.禁用基于内容的重复数据删除

*仅适用于FIFO(先进先出)队列
禁用基于内容的重复数据删除。Amazon SQS 将不会使用 SHA-256 哈希值对消息正文生成消息重复数据删除 ID。

/**
 * 禁用基于内容的重复数据删除
 * 
 * @param queueUrl - 队列url,必填
*/
void disableContentBasedDeduplication(String queueUrl)

注:

3.2.9.启用FIFO队列高吞吐量

*仅适用于FIFO(先进先出)队列
FIFO 队列的高吞吐量支持每个 API 每秒更高数量的请求。想要增加 FIFO 队列的高吞吐量请求数,可以增加使用的消息组数。每个消息组每秒支持 300 个请求。

/**
 * 启用FIFO队列高吞吐量
 * 
 * @param queueUrl - 队列url,必填
*/
void enableHighThroughput(String queueUrl)

注:

3.2.10.禁用FIFO队列高吞吐量

*仅适用于FIFO(先进先出)队列

/**
 * 禁用FIFO队列高吞吐量
 * 
 * @param queueUrl - 队列url,必填
*/
void disableHighThroughput(String queueUrl)

注:

3.2.11.启用队列服务端加密功能

Amazon SQS 默认提供传输中加密。另外我们还可以启用服务器端加密(SSE),这意味着 SQS 将会加密 SQS 服务器上的所有静态客户数据。服务器端加密 (SSE) 会在 Amazon SQS 收到消息后立即对其进行加密。消息以加密形式存储,并且 Amazon SQS 仅在将消息发送给授权使用者时对其进行解密。

/**
 * 启用队列服务端加密功能
 * 
 * @param queueUrl - 队列url,必填
 * @param queueName - 队列名称,必填
 * @param kmsMasterKeyId - kms主密钥别名,前2个接口使用默认值,后2个接口必填
 * @param kmsDataKeyReusePeriodSeconds - 数据密钥重用周期,前2个接口使用默认值,后2个接口必填
*/
void enableServerSideEncryptionByName(String queueName)

void enableServerSideEncryptionByUrl(String queueUrl)

void enableServerSideEncryptionByName(String queueName, String kmsMasterKeyId, Integer kmsDataKeyReusePeriodSeconds)

void enableServerSideEncryptionByUrl(String queueUrl, String kmsMasterKeyId, Integer kmsDataKeyReusePeriodSeconds)

注:

  • kmsMasterKeyId - kms主密钥别名,Amazon SQS 或自定义 CMK 的 AWS 托管客户主密钥 (CMK) 的 ID,默认值:alias/aws/sqs。可自定义,例如:alias/MyAlias。空字符串表示禁用加密服务,null为非法参数值。
  • kmsDataKeyReusePeriodSeconds - 再次调用 AWS KMS 之前,Amazon SQS 可以重复使用数据密钥来加密或解密消息的时间长度(有效值:60(1 分钟)到 86400(24 小时),单位秒,默认值:300(5 分钟))。较短的时间段可提供更好的安全性,但会导致对 KMS 的更多调用,这可能会在免费套餐之后产生费用。
  • 详见官方文档

3.2.12.禁用队列服务端加密功能

不使用服务端加密功能,不影响传输中加密。

/**
 * 禁用队列服务端加密功能
 * 
 * @param queueUrl - 队列url,必填
 * @param queueName - 队列名称,必填
*/
void disableServerSideEncryptionByName(String queueName)

void disableServerSideEncryptionByUrl(String queueUrl)

注:


4.查询当前区域中的队列列表

/**
 * 查询当前区域中的队列列表
 * 
 * @param maxResults - 最大返回数量,非必填
 * @param queueNamePrefix - 队列名称前缀,非必填
 * @return 队列url集合
*/
List<String> listQueues()

List<String> listQueues(Integer maxResults, String queueNamePrefix)

注:

  • 参数 maxResults - 最大返回数量,默认值为1000,最大值也为1000。

5.获取队列属性集合

获取指定队列的指定属性的属性值。

/**
 * 获取队列属性集合
 * 
 * @param queueUrl - 队列url,必填
 * @param attributeNames - 想要返回的属性的集合,非必填
 * @return 响应体
*/
GetQueueAttributesResponse getQueueAttributes(String queueUrl, List<QueueAttributeNameEnum> attributeNames)

注:

  • 参数 attributeNames - 想要返回的属性的集合,不传或传空集时默认获取所有属性。
  • 响应体中的 attributes 为获取到的属性-属性值Map,类型为Map<String, String>。

6.查询指定死信队列的源队列集合

源队列与死信队列的关系为多对一,即一个源队列只能有一个死信队列,一个死信队列可以被多个源队列配置。该接口查询的就是配置了指定死信队列的所有源队列。

/**
 * 查询指定死信队列的源队列集合
 * 
 * @param queueUrl - 死信队列url,必填
 * @param maxResults - 最大返回数量,非必填
 * @param nextToken - 翻页参数,非必填
 * @return 响应体
*/
ListDeadLetterSourceQueuesResponse listDeadLetterSourceQueues(String queueUrl, Integer maxResults, String nextToken)

注:

  • 参数 maxResults - 最大返回数量,默认值为1000,最大值也为1000。
  • 参数 nextToken - 从当前接口的响应体中获取,用于翻页查询下一页。
  • 响应体中的 queueUrls 为源队列url集合。
  • 响应体中的 nextToken 为查询下一页的翻页参数。

7.给队列添加标签和值

向队列中添加标签,以帮助组织和识别队列,标签没有任何语义含义。

/**
 * 给队列添加标签和值
 * 
 * @param queueUrl - 队列url,必填
 * @param tags - 标签Map,必填且不为空
*/
void tagQueue(String queueUrl, Map<String, String> tags)

注:

  • 建议队列的标签数量不超过 50 个。
  • 标签区分大小写。
  • 相同的新标签将覆盖现有的标签。

8.查询队列标签集合

/**
 * 查询队列标签集合
 * 
 * @param queueUrl - 队列url,必填
 * @return 响应体
*/
ListQueueTagsResponse listQueueTags(String queueUrl)

注:

  • 响应体中的 tags 为获取到的标签-标签值Map,类型为Map<String, String>。

9.删除队列中指定的标签

/**
 * 删除队列中指定的标签
 * 
 * @param queueUrl - 队列url,必填
 * @param tagKeys - 要删除的标签的key的集合,必填且不为空
 * @return 队列url
*/
void untagQueue(String queueUrl, List<String> tagKeys)

注:

  • 若队列中存在参数 tagKeys 中的标签,则删除对应标签;若队列中不存在参数 tagKeys 中的标签,则跳过,接口不会报错。

10.添加权限

为特定主体向队列添加权限 。这允许共享对队列的访问。创建队列时,队列的所有者对队列具有完全控制访问权限。只有队列的所有者可以授予或拒绝对队列的权限。

/**
 * 添加权限
 * 
 * @param queueUrl - 队列url,必填
 * @param actions - 客户端希望对指定主体允许的操作,必填
 * @param label - 正在添加的权限的唯一标识,必填
 * @param awsAccountIds - 被授予权限的委托人的 AWS 账号,必填
*/
void addPermission(String queueUrl, List<String> actions, String label, List<String> awsAccountIds)

注:

  • 参数 actions - 有效值:任何操作的名称或*。
  • 参数 label - 最多80个字符,允许的字符包括字母数字字符、连字符-和下划线_。例如:AliceSendMessage。
  • 参数 awsAccountIds - 委托人必须拥有 AWS 账户,但不需要注册 Amazon SQS。
  • 详见官方文档

11.删除权限

撤销队列策略中与指定Label参数匹配的任何权限。只有队列的所有者才能从中删除权限,跨账户权限不适用于此操作。

/**
 * 删除权限
 * 
 * @param queueUrl - 队列url,必填
 * @param label - 要删除的权限的标识,必填
*/
void removePermission(String queueUrl, String label)

注:

  • 参数 label - 这是使用AddPermission操作添加的标签。
  • 详见官方文档

12.清空队列

删除指定队列中的消息。

/**
 * 清空队列
 * 
 * @param queueUrl - 队列url,必填
*/
void purgeQueue(String queueUrl)

注:


13.删除队列

删除指定的队列。

/**
 * 删除队列
 * 
 * @param queueUrl - 队列url,必填
*/
void deleteQueue(String queueUrl)

注:

  • 删除队列时,队列中的任何消息都不再可用。
  • 删除队列时,删除过程最多需要 60 秒。您在 60 秒内发送的涉及该队列的请求可能会成功。例如, 请求可能成功,但 60 秒后队列和您发送的消息不再存在。
  • 删除队列时,必须等待至少 60 秒才能创建同名队列。
  • 详见官方文档
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Amazon SQS(简单队列服务)是一种完全托管的消息队列服务,可用于在分布式应用程序之间传递消息。AWS SDK for Java 提供了 Amazon SQS 的开发工具包,使您可以轻松地与 Amazon SQS 进行交互并发送和接收消息。下面是使用 AWS SDK for Java 与 Amazon SQS 交互的步骤: 1. 配置 AWS 访问凭证:在使用 AWS SDK for Java 之前,您需要配置 AWS 访问凭证。访问凭证包括 AWS 访问密钥 ID 和秘密访问密钥。您可以使用 AWS 身份和访问管理(IAM)创建和管理这些凭证。 2. 创建 Amazon SQS 客户端:使用 AWS SDK for Java 创建 AmazonSQSClient 对象,以便与 Amazon SQS 服务进行交互。 ``` AmazonSQS sqs = AmazonSQSClientBuilder.standard() .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)) .withRegion(Regions.US_EAST_1) .build(); ``` 3. 创建队列:使用 AmazonSQS 对象的 createQueue() 方法创建一个新的队列,并将其命名为您选择的名称。 ``` CreateQueueRequest create_request = new CreateQueueRequest(queueName); String myQueueUrl = sqs.createQueue(create_request).getQueueUrl(); ``` 4. 发送消息:使用 AmazonSQS 对象的 sendMessage() 方法向队列发送消息。 ``` SendMessageRequest send_msg_request = new SendMessageRequest() .withQueueUrl(myQueueUrl) .withMessageBody("hello world") .withDelaySeconds(5); sqs.sendMessage(send_msg_request); ``` 5. 接收消息:使用 AmazonSQS 对象的 receiveMessage() 方法从队列中接收消息。 ``` ReceiveMessageRequest receive_request = new ReceiveMessageRequest() .withQueueUrl(myQueueUrl) .withWaitTimeSeconds(20); List<Message> messages = sqs.receiveMessage(receive_request).getMessages(); for (Message message : messages) { // 处理消息 } ``` 6. 删除消息:使用 AmazonSQS 对象的 deleteMessage() 方法从队列中删除已处理的消息。 ``` String messageReceiptHandle = message.getReceiptHandle(); sqs.deleteMessage(new DeleteMessageRequest(myQueueUrl, messageReceiptHandle)); ``` 这些是使用 AWS SDK for Java 与 Amazon SQS 进行交互的基本步骤。您可以根据需要进行调整,以满足您的特定应用程序需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值