我使用春云的SqsListener从AWS的简单队列服务(SQS)接收JSON格式中的AWS通知。
这是侦听器的代码:
@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不应该自动转换吗?
发布于 2016-04-11 08:54:10
是的应该的。事实上确实如此。
为了在反序列化过程中调用正确的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。
发布于 2019-03-21 15:19:19
这在没有@NotificationMessage的情况下也是有效的。这样,您不需要发送"Type“和"Message”部分,这是使用此注释所必需的。
首先,创建一个具有所需属性的类。
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")烦恼可以是可选的,这取决于您的春季版本以及您的属性是否与Json字符串中的名称相同。例如,如果您的属性名为task,而您的Json字符串是{"task":"My task"},则没有必要。
https://stackoverflow.com/questions/36544017
复制相似问题