首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SNS和SQS中使用SqsListener

在SNS和SQS中使用SqsListener
EN

Stack Overflow用户
提问于 2016-04-11 08:54:10
回答 2查看 19.7K关注 0票数 13

我使用春云SqsListener从AWS的简单队列服务(SQS)接收JSON格式中的AWS通知。

这是侦听器的代码:

代码语言:javascript
复制
@SqsListener(value = "my-queue", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
public void handle(final MyObject obj) throws Exception {
// ...
}

上面链接的文档仅仅是关于向队列发送和读取普通序列化对象的文档,我认为接收SNS消息应该是开箱即用的。但是我最终收到了转换错误:

10:45:51.480 simpleMessageListenerContainer-2错误o.s.c.a.m.l.SimpleMessageListenerContainer -处理消息时遇到的异常。org.springframework.messaging.MessagingException:调用处理程序方法时发生异常;嵌套的异常是org.springframework.messaging.converter.MessageConversionException:无转换器,用于转换为类com.myproject.model.MyObject,message=GenericMessage

我还尝试创建一个外观类似于上面链接的SNS Json格式的包装器对象,但我仍然得到了相同的异常。唯一有效的类型是签名中的字符串。SNS不应该自动转换吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-11 08:54:10

是的应该的。事实上确实如此。

为了在反序列化过程中调用正确的HandlerMethodArgumentResolver (在本例中是NotificationMessageArgumentResolver),然后调用正确的转换器NotificationRequestConverter,只需将注释org.springframework.cloud.aws.messaging.config.annotation.NotificationMessage添加到方法签名中即可。例如。

代码语言:javascript
复制
@SqsListener(value = "my-queue", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
public void handle(final @NotificationMessage MyObject obj) throws Exception {
// ...
}

这样,您的SNS的Message部分将被提取并转换为MyObject

票数 9
EN

Stack Overflow用户

发布于 2019-03-21 15:19:19

这在没有@NotificationMessage的情况下也是有效的。这样,您不需要发送"Type“和"Message”部分,这是使用此注释所必需的。

首先,创建一个具有所需属性的类。

代码语言:javascript
复制
public class SqsMessage {

   private String myTask;

   public SqsMessage() {
   }

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

   //Getter + Setter 
}

下一步,设置侦听器

代码语言:javascript
复制
@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,如

代码语言:javascript
复制
{"MyTask":"My task"}

POJO的构造函数中的@JsonProperty("MyTask")烦恼可以是可选的,这取决于您的春季版本以及您的属性是否与Json字符串中的名称相同。例如,如果您的属性名为task,而您的Json字符串是{"task":"My task"},则没有必要。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36544017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档