![](/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.