适用于AWS的Spring Cloud - 如何转换从SQS收到并由S3发送的消息

时间:2016-01-29 23:31:45

标签: amazon-web-services amazon-s3 amazon-sqs spring-cloud

我已将S3配置为每次上传文件时触发事件。该活动将转至SQS。现在我想用Spring Cloud for AWS读取队列中的消息。有没有办法将有效负载转换为代表S3事件记录的已知类型?我试过

package com.test;
import java.util.Map;

import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.MessageMapping;

import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord;

public class SQSHandler {
    @MessageMapping("MediaQueue")
    private void receiveMessage(S3EventNotificationRecord message, @Headers Map<String, String> headers) {
        System.out.println("MYK MYK MYK");
    }
}

但我收到错误

  

ord,message = GenericMessage [payload = {here is whole payload}]       在org.springframework.messaging.handler.annotation.support.PayloadArgumentResolver.resolveArgument(PayloadArgumentResolver.java:115)       在org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77)       在org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:137)       在org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:106)       在org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMatch(AbstractMethodMessageHandler.java:447)       ......还有8个

你知道做这样的事情的方法吗?

2 个答案:

答案 0 :(得分:2)

问题的解决方案如下:

 import com.amazonaws.services.s3.event.S3EventNotification;

 @MessageMapping("${mediaQueueName}")
private void receiveMessage(String message, @Header(value = "MessageId") String messageId) {
    S3EventNotification notification = S3EventNotification.parseJson(message);
    //do whatever you need
}

答案 1 :(得分:0)

根据Spring Cloud Messaging docs,您需要配置自己的MappingJackson2MessageConverter,并将strictContentTypeMatch设置为false。

然后你的代码应该有效:

@MessageMapping("MediaQueue")
private void receiveMessage(S3EventNotificationRecord message, @Headers Map<String, String> headers) {
    System.out.println("MYK MYK MYK");
}