Muster ständig zu hören AWS SQS-Nachrichten
Habe ich eine einfache Klasse mit dem Namen QueueService
mit einigen Methoden, wickeln Sie die Methoden, die von der AWS SQS-SDK für Java. Zum Beispiel:
public ArrayList<Hashtable<String, String>> receiveMessages(String queueURL) {
List<Message> messages = this.sqsClient.receiveMessage(queueURL).getMessages();
ArrayList<Hashtable<String, String>> resultList = new ArrayList<Hashtable<String, String>>();
for(Message message : messages) {
Hashtable<String, String> resultItem = new Hashtable<String, String>();
resultItem.put("MessageId", message.getMessageId());
resultItem.put("ReceiptHandle", message.getReceiptHandle());
resultItem.put("Body", message.getBody());
resultList.add(resultItem);
}
return resultList;
}
Habe ich noch eine weitere Klasse mit dem Namen App
hat eine main
und schafft eine instace von der QueueService
.
Ich Suche für ein "Muster" zu machen, die main
im App
zu hören, für neue Nachrichten in der Warteschlange. Jetzt habe ich eine while(true)
Schleife, wo ich den Anruf receiveMessages
Methode:
while(true) {
messages = queueService.receiveMessages(queueURL);
for(Hashtable<String, String> message: messages) {
String receiptHandle = message.get("ReceiptHandle");
String messageBody = message.get("MessageBody");
System.out.println(messageBody);
queueService.deleteMessage(queueURL, receiptHandle);
}
}
Ist das der richtige Weg? Sollte ich das async-Nachricht receive-Methode in SQS-SDK?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meines Wissens, es keine Möglichkeit gibt, im Amazon SQS unterstützt eine aktive Zuhörer-Modell, bei dem Amazon SQS würde "push" - Nachrichten, um Ihre Zuhörer, oder aufrufen würde Ihre Nachricht listener, wenn Nachrichten vorhanden sind.
So, Sie würde immer noch zum abrufen von Nachrichten. Es gibt zwei polling-Mechanismen unterstützt, die für die polling - Short-Polling und Long Polling. Jeder hat seine eigenen vor-und Nachteile, aber Lange Polling ist die, die Sie normalerweise am Ende mit in den meisten Fällen, obwohl die Standardeinstellung ist Kurz Polling. Long-Polling-Mechanismus ist definitiv effizienter in Bezug auf Datenverkehr im Netzwerk, ist kostengünstiger (wegen Amazon Gebühren, die Sie durch die Anzahl der Zugriffe), und ist auch der bevorzugte Mechanismus, wenn Sie möchten, dass Ihre Nachrichten verarbeitet werden, in einer Zeit, sensible Art und Weise (~= Prozess so bald wie möglich).
Gibt es mehr Feinheiten rund um Long Polling und Kurze Polling, die es Wert sind zu wissen, und es ist etwas schwer zu umschreiben, das alles hier, aber wenn Sie möchten, können Sie Lesen eine Menge mehr details über diesen durch die folgenden blog. Es hat ein paar code-Beispiele, die als gut, das sollte hilfreich sein.
http://pragmaticnotes.com/2017/11/20/amazon-sqs-long-polling-versus-short-polling/
Im Sinne einer while(true) - Schleife, ich würde sagen, es hängt davon ab.
Wenn Sie mit Long-Polling, und Sie können die Wartezeit, bis die (max) 20 Sekunden, so dass Sie nicht die Umfrage der SQS oft mehr als 20 Sekunden lang gedrückt, wenn keine Nachrichten vorhanden sind. Wenn Nachrichten vorhanden sind, können Sie entscheiden, ob die Umfrage Häufig (um Nachrichten zu verarbeiten, sobald Sie eintreffen) oder ob Sie immer verarbeiten, Sie in Zeitabständen (sagen alle n Sekunden).
Ein weiterer Punkt zu beachten wäre, dass Sie Lesen konnte, und kann bis zu 10 Nachrichten in einer einzigen receiveMessages Anfrage, damit würde auch eine Verringerung der Anzahl der Anrufe, die Sie machen, SQS, was die Kosten senkt. Und wie die obigen blog erklärt im Detail, können Sie verlangen, um zu Lesen 10 Nachrichten, aber kann es nicht zurückgeben Sie 10 auch wenn es viele Nachrichten in der Warteschlange.
Im Allgemeinen jedoch, ich würde sagen, Sie brauchen, um zu bauen entsprechenden Haken und exception-handling, zum ausschalten des polling-wenn Sie möchten, zur Laufzeit, im Fall Sie sind mit einer while(true) eine Art Struktur.
Ein weiterer Aspekt ist, ob Sie möchten, um die Umfrage der SQS in Ihrem Haupt-application-thread-oder Sie möchten, um zu laichen einen anderen thread. Also eine andere Möglichkeit könnte sein, die ScheduledThreadPoolExecutor mit einem einzigen thread in der main zu planen, dass ein thread eine Umfrage der SQS periodisch (alle paar Sekunden), und können Sie nicht brauchen eine while(true) Struktur.
Gibt es ein paar Dinge, die Sie fehlen:
receiveMessages(ReceiveMessageRequest)
und setzen eine Wartezeit zu ermöglichen, long-polling.OverLimitException
, die geworfen werden können, vonreceiveMessages()
wenn Sie hätte zu viele in-flight-Nachrichten.while
loop in seinen eigenen try/catch-block, logging, alle Ausnahmen gefangen werden (es sollte nicht sein-das ist hier, um sicherzustellen, dass Ihre Anwendung nicht Abstürzen, weil AWS änderten Ihre API oder Sie vernachlässigt, um zu behandeln eine erwartete Ausnahme).Sehen doc weitere Informationen zu long-polling und mögliche Ausnahmen.
Wie für die Verwendung der asynchronen client: Sie haben einen bestimmten Grund, es zu benutzen? Wenn nicht, dann nicht: einen Empfänger-thread ist viel einfacher zu verwalten.
Callable
dann führen Sie es auf einem internen thread-pool. Ich bin mir nicht sicher, was die "SQS service wrapper" ist, aber die SQS ist derzeit nicht unterstützte Quelle. Die meisten Menschen nutzen SNS statt, einige nutzen zu können.Wenn Sie verwenden möchten, SQS und dann die lambda, die Anforderung zu verarbeiten, können Sie befolgen Sie die angegebenen Schritte in der link oder Sie verwenden immer lambda anstelle von SQS und invoke-lambda für jede Anforderung.