![](/img/trans.png)
[英]Unable to listen the SQS messages in java SqsListener produced from the python using boto SDK
[英]Using SqsListener with SNS and SQS
我正在使用spring-cloud-aws的SqsListener從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.