4

Ich verwende spring-cloud-aws 's SqsListener, um AWS SNS HTTP-Benachrichtigungen in JSON Format von AWS Simple Queue Service (SQS) zu erhalten. Verwenden von SqsListener mit SNS und SQS

Dies ist der Code für den Hörer:

@SqsListener(value = "my-queue", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS) 
public void handle(final MyObject obj) throws Exception { 
// ... 
} 

Die Dokumentation oben verlinkten ist nur über das Senden und Ebene serialisiert Objekte in die Queue zu lesen und ich dachte, dass der Empfang von SNS-Nachrichten erwartet wird, aus dem Kasten heraus arbeiten . Aber ich am Ende Empfang Konvertierungsfehler:

10: 45: 51,480 [simpleMessageListenerContainer-2] ERROR o.s.c.a.m.l.SimpleMessageListenerContainer - Ausnahme auf beim Verarbeiten der Nachricht. org.springframework.messaging.MessagingException: Beim Aufrufen der Handler-Methode ist eine Ausnahme aufgetreten; verschachtelte Ausnahme ist org.springframework.messaging.converter.MessageConversionException: Nein Konverter zur Umwandlung in der Klasse com.myproject.model.MyObject gefunden, message = GenericMessage

Ich versuchte auch ein Wrapper-Objekt erstellen, die wie folgt aussehen das erwartete SNS Json Format oben verlinkt, aber ich bekomme immer die selbe Ausnahme. Der einzige Typ, der funktioniert, ist ein String in der Signatur. Sollte der SNS nicht automatisch konvertiert werden?

Antwort

4

Ja sollte es. Und das tut es tatsächlich. NotificationRequestConverter müssen Sie einfach hinzufügen, um die Anmerkung org.springframework.cloud.aws.messaging.config.annotation.NotificationMessage auf Ihre Methodensignatur

Um die korrekte HandlerMethodArgumentResolver aufgerufen zu haben (in diesem Fall NotificationMessageArgumentResolver) auf Deserialisierung, was wiederum den richtigen Konverter aufruft. Z.B.

@SqsListener(value = "my-queue", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS) 
public void handle(final @NotificationMessage MyObject obj) throws Exception { 
// ... 
} 

Auf diese Weise der Message Teil Ihrer SNS extrahiert wird und zu MyObject umgewandelt.

+0

Wie können Sie Objekte als Strings von SQS empfangen? Stimmt es, dass SQS nur Strings als Nachrichten unterstützt? – jtcotton63

+0

@ jtcotton63 ist es wahr. Die Payload kommt als 'String' - ein JSON-Objekt - die' @ NotificationMessage' ruft einen Konverter auf, der die Payload in ein Objekt der gewünschten Klasse konvertiert. – msparer