我有以下代码从SQS队列中检索消息。 我使用
问题在于当我检查AWS控制台时,消息始终处于in-flight状态,但应用程序永远不会接收到该消息(大小始终为0)。看起来
有什么想法吗?
AmazonSQSBufferedAsyncClient
从队列中检索消息。 固定延迟的SingleThreadedExecutor
每5分钟唤醒一次,调用receiveMessage
。 队列启用了长轮询。@Service
public class AmazonQueueService
implements QueueService<String> {
@Autowired
private AmazonSQSBufferedAsyncClient sqsAsyncClient;
@Value("${aws.sqs.queueUrl}")
private String queueUrl;
@Override
public List<Message<String>> receiveMessage() {
ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl);
ReceiveMessageResult result = sqsAsyncClient.receiveMessage(receiveMessageRequest);
LOG.debug("Size=" + result.getMessages().size());
return Lists.transform(result.getMessages(), ......);
}
.....
}
问题在于当我检查AWS控制台时,消息始终处于in-flight状态,但应用程序永远不会接收到该消息(大小始终为0)。看起来
AmazonSQSBufferedAsyncClient
正在从队列中读取消息,但在receiveMessage
调用中没有返回。有什么想法吗?
AmazonSQSBufferedAsyncClient
如何配置(超时、线程等)?队列如何配置,关于消息的可见性超时?或者在发送消息时是否指定了可见性超时? - Bruno Reis@Autowired
)。你有可能会创建多个AmazonSQSBufferedAsyncClient
的实例,而不是一个单例实例,它被所有AmazonQueueService
类的实例共享吗?如果是这种情况,它们将会竞争消息。你可以尝试打印AmazonSQSBufferedAsyncClient
的.hashCode()
来确保你只有一个实例... - Bruno Reis