1

我正在准备从 Amazon SQS 监听的演示程序。下面是我的代码。

xml配置

<aws-messaging:annotation-driven-queue-listener  amazon-sqs="sqsClient" max-number-of-messages="10" wait-time-out="20" visibility-timeout="100" />

用户服务监听器.java

@Configuration
@EnableSqs
@Component
public class UserServiceListenr {
    @SqsListener(value = "CMR", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
    public void myQueueListener(Message message) throws Exception{
        try {
            System.out.println("Message Listen start");
            System.out.println("Message part "+message);
        }catch(Exception e){
            System.out.println(" message Exception " + e);
        }
    }
}

我在 SQS 队列上放了 2 条消息。当我尝试使用此演示程序获取消息时,消息在我的 AWS 控制台中显示 Messages_in_flight 列。但消息没有到达我的 sqsListener 方法,几分钟后消息显示到 AWS 控制台中的 Messages_available 列。

以下是我运行程序时遇到的异常。

QueueMessageHandler:294 - 1 message handler methods found on class com.sophos.cmr.demo.UserServiceListenr: {public void com.sophos.cmr.demo.UserServiceListenr.myQueueListener(java.lang.String) throws java.lang.Exception=org.springframework.cloud.aws.messaging.listener.QueueMessageHandler$MappingInformation@5f0e9815}

那么,如果有任何线索,出了什么问题?

4

2 回答 2

0

当您看到该消息移动到 Messages_in_flight 列时 - 这意味着该消息已被消费者拾取,但对于此特定消息的成功处理确认仍然没有收到。

所以原因可能是下一个:1)在处理来自 SQS 的消息期间出现错误/异常 2)Spring 找不到合适的 ArgumentResolver 将收入消息从 SQS 转换为您的 bean。我看到你正在使用你的自定义 bean - '消息'

您可以查看文档,第 5.2.5 节

于 2017-03-14T22:05:00.817 回答
0

我有一个类似的问题并且能够解决它。文档在这个问题上并不清楚。我在这里添加它以防有人稍后看到。

首先,当您将项目插入队列时,您需要设置一些额外的消息属性,以便 Spring 知道将其编组到您的 bean 中。如果在将消息添加到队列时在 GUI 中设置名称:contentType 类型:字符串值:application/json,那么 spring 将尝试使用 Jackson 编组它。

其次,我无法@SqsListener使用非 String 参数,除非它位于使用@Controller. 对于非控制器类,我必须添加第二个方法参数(@Header("SenderId") String senderId为我工作),然后正确路由

于 2020-04-29T18:58:19.500 回答