6

SQS キューからメッセージを取得する次のコードがあります。AmazonSQSBufferedAsyncClientQueue からメッセージを取得するためにを使用しています。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 コンソールを確認すると、メッセージは常に実行中ですが、アプリケーションで受信されることはありません (サイズは常に 0 として出力されます)。がキューからメッセージを読み取っているように見えますが、呼び出しAmazonSQSBufferedAsyncClientに戻っていません。receiveMessage

何か案は?

4

3 に答える 3

5

最後にこれを理解しました。この問題は、キューの可視性のタイムアウト (2 分) と、scheduledExecutor の遅延 (5 分) の組み合わせで明らかになります。

可視性タイムアウトを 15 分に増やすと、問題が解決しました。

私の理論は - > AmazonSQSBufferedAsyncClient はメッセージを取得し、 receiveMessage 呼び出しを待つバッファに保持します。エグゼキューターの遅延は 5 分であるため、メッセージの可視性は receiveMessage が呼び出される前にタイムアウトになり、メッセージはキューに返されます。また、メッセージはほとんどすぐにキューから取り出されたようです。そして今、何らかの理由で receiveMessage を呼び出してもメッセージが受信されません。タイムアウトイベントの前に receiveMessage 呼び出しが発生する可能性を与えるタイムアウトを増やすと、問題が解決したと思います。

他に考えられる説明はありますか?

于 2013-08-16T15:45:16.713 に答える