【发布时间】:2021-06-01 05:07:14
【问题描述】:
如何配置可见性超时,以便可以再次读取 SQS 中的消息?
我将 Amazon SQS 作为消息队列。多个应用程序正在发送消息。我现在正在使用 Spring 侦听器读取队列中的消息,如下所示:
public DefaultMessageListenerContainer jmsListenerContainer() {
SQSConnectionFactory sqsConnectionFactory = SQSConnectionFactory.builder()
.withAWSCredentialsProvider(new DefaultAWSCredentialsProviderChain())
.withEndpoint(environment.getProperty("aws_sqs_url"))
.withAWSCredentialsProvider(awsCredentialsProvider)
.withNumberOfMessagesToPrefetch(10).build();
DefaultMessageListenerContainer dmlc = new DefaultMessageListenerContainer();
dmlc.setConnectionFactory(sqsConnectionFactory);
dmlc.setDestinationName(environment.getProperty("aws_sqs_queue"));
dmlc.setMessageListener(queueListener);
return dmlc;
}
queueListener 类实现了javax.jms.MessageListener,它进一步使用了onMessage() 方法。
我还配置了一个调度程序,在一段时间后再次读取队列。它使用receiveMessage() 或com.amazonaws.services.sqs.AmazonSQS。
一旦消息到达队列,侦听器就会读取消息。我想在一段时间后再次阅读该消息,即通过调度程序,但是一旦听众阅读了一条消息,它就不会变得可见或再次阅读。根据 Amazon 的 SQS 开发人员指南,默认可见性超时为 30 秒,但该消息即使在 30 秒后也不会变得可见。我尝试在 SQS QUEUE PARAMETER CONSOLE 中设置自定义可见性超时,但它不起作用。
关于信息,没有人从队列中删除消息。
【问题讨论】:
-
为什么您要故意再次阅读同一条消息?隐形超时旨在处理在处理过程中失败的消息(例如,工作人员在完成任务之前死亡)。您需要多次阅读同一条消息的特定用例是什么?
-
如果消息读取和处理成功,我将从队列中删除它。但是,如果处理消息或线程/服务器在执行过程中被杀死,即在手动触发删除消息之前,我想再次阅读消息以再次处理。
-
好。这听起来像是正常的过程。根据下面贾斯汀的回答,由于您使用的库,该消息听起来像是自动删除。
标签: amazon-web-services jms message-queue amazon-sqs spring-jms