我有以下代碼從SQS隊列中檢索消息。我正在使用AmazonSQSBufferedAsyncClient
從隊列中檢索消息。固定延遲SingleThreadedExecutor
每5分鐘喚醒一次,呼叫receiveMessage
。長輪詢在隊列SQS消息總是留在機上
@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控制檯,該消息始終在飛行,但它從來沒有在應用程序接收(大小總是打印爲0)。看起來AmazonSQSBufferedAsyncClient
正在從隊列中讀取消息,但不會在receiveMessage
調用中返回。
任何想法?
了'AmazonSQSBufferedAsyncClient'如何配置(超時,線程等)?以及如何配置隊列,關於消息的可見性超時?或者,您是否在發送消息時指定了可見性超時? –
剛剛發生的事情:您似乎正在使用某種依賴注入('@ Autowired')。你能否創建'AmazonSQSBufferedAsyncClient'的多個實例,而不是一個單一的實例,它是在你的類「AmazonQueueService」的所有實例之間共享的?如果是這樣的話,他們會爭取消息。你可以嘗試打印'AmazonSQSBufferedAsyncClient'的'.hashCode()'只是爲了確保您有一個實例... –
林prettry確保只有AmazonSQSBufferedAsyncClient的'單個實例」。隊列屬性如下 – vijay