我已将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个
你知道做这样的事情的方法吗?
答案 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");
}