簡體   English   中英

將SqsListener與SNS和SQS一起使用

[英]Using SqsListener with SNS and SQS

我正在使用spring-cloud-awsSqsListener從AWS的簡單隊列服務(SQS)接收JSON格式的 AWS SNS HTTP通知。

這是監聽器的代碼:

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

上面鏈接的文檔只是關於向隊列發送和讀取普通的序列化對象,我認為接收SNS消息應該是開箱即用的。 但我最終收到轉換錯誤:

10:45:51.480 [simpleMessageListenerContainer-2] ERROR oscamlSimpleMessageListenerContainer - 處理消息時遇到異常。 org.springframework.messaging.MessagingException:調用處理程序方法時發生異常; 嵌套異常是org.springframework.messaging.converter.MessageConversionException:找不到轉換為com.myproject.model.MyObject類的轉換器,message = GenericMessage

我也嘗試創建一個看起來像上面鏈接的預期SNS Json格式的包裝器對象,但我一直得到相同的異常。 唯一有效的類型是簽名中的String。 不應該自動轉換SNS嗎?

是的,它應該。 它實際上確實如此。

為了在反序列化時調用正確的HandlerMethodArgumentResolver (在本例中為NotificationMessageArgumentResolver ),反過來調用正確的轉換器NotificationRequestConverter您只需要在方法中添加注釋org.springframework.cloud.aws.messaging.config.annotation.NotificationMessage簽名。 例如

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

這樣,SNS的Message部分將被提取並轉換為MyObject

這也可以在沒有@NotificationMessage情況下工作。 這樣您就不需要發送使用此注釋所需的“類型”和“消息”部分。

首先創建一個具有所需屬性的類。

public class SqsMessage {

   private String myTask;

   public SqsMessage() {
   }

   public SqsMessage(@JsonProperty("MyTask") String myTask ) {
       this.myTask = myTask ;
   }

   //Getter + Setter 
}

接下來設置監聽器

@SqsListener(value = {"MyQueue"}, deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
public void receiveMessage(SqsMessage payload, @Headers Map<String, Object> header) {
   logger.info("Got message with task: " + payload.getTask() 
    + " with custom attribute " + header.get("CustomAttribute").toString());
}

現在您可以發送類似的JSON

{"MyTask":"My task"}

POJO構造函數中的@JsonProperty("MyTask") annoation可以是可選的,具體取決於您的spring版本以及您的屬性是否與Json字符串中的名稱相同。 例如,如果你的屬性被稱為task而你的Json字符串是{"task":"My task"} ,則沒有必要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM