Warum bleiben SqS-Nachrichten manchmal in der Warteschlange

Ich verwende Amazon SQS-Warteschlangen auf sehr einfache Weise. Normalerweise werden Nachrichten geschrieben und sofort sichtbar und gelesen. Gelegentlich wird eine Nachricht geschrieben, die während des Flugs (nicht sichtbar) mehrere Minuten in der Warteschlange verbleibt. Ich kann es von der Konsole aus sehen. Die Wartezeit für Nachrichtenempfang beträgt 0 und die Standardsichtbarkeit 5 Sekunden. Dies wird für einige Minuten so bleiben, oder bis eine neue Nachricht geschrieben wird, die sie irgendwie freigibt. Ein paar Sekunden Verzögerung sind in Ordnung, aber mehr als 60 Sekunden sind nicht in Ordnung.

Es gibt 8 Leser-Threads, die immer lange abfragen, es ist also nicht so, dass etwas nicht versucht, sie zu lesen.

Bearbeiten : Um klar zu sein, keine der Consumer-Lesevorgänge gibt Nachrichten zurück, und dies geschieht unabhängig davon, ob die Konsole geöffnet ist oder nicht. In diesem Szenario ist nur eine Nachricht betroffen, und sie befindet sich nur in der Warteschlange, die für die Verbraucher unsichtbar ist.

Hat jemand anderes dieses Verhalten gesehen und was kann ich tun, um es zu verbessern?

Hier ist das SDK für Java, das ich benutze:

<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk</artifactId>
  <version>1.5.2</version>
</dependency>     

Hier ist der Code, der das Lesen durchführt (max = 10, maxwait = 0 Startkonfiguration):

void read(MessageConsumer consumer) {

  List<Message> messages = read(max, maxWait);

  for (Message message : messages) {
    if (tryConsume(consumer, message)) {
      delete(message.getReceiptHandle());
    }
  }
}

private List<Message> read(int max, int maxWait) {

  AmazonSQS sqs = getClient();
  ReceiveMessageRequest rq = new ReceiveMessageRequest(queueUrl);
  rq.setMaxNumberOfMessages(max);
  rq.setWaitTimeSeconds(maxWait);
  List<Message> messages = sqs.receiveMessage(rq).getMessages();

  if (messages.size() > 0) {
    LOG.info("read {} messages from SQS queue",messages.size());
  }

  return messages;
}

Die Protokollzeile für "read .." wird nie angezeigt, wenn dies geschieht. Dies veranlasst mich, mit der Konsole zu arbeiten und zu prüfen, ob die Nachricht vorhanden ist oder nicht.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage