spring cloud AWS SQS Listener Issue

时间:2017-01-27 11:23:26

标签: java spring-cloud amazon-sqs spring-cloud-aws

我正在准备从Amazon SQS收听的演示程序.Below是我的代码。

xml config

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

UserServiceListenr.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}

那么如果有任何线索会出错?

2 个答案:

答案 0 :(得分:0)

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

理由可能是下一个: 1)来自SQS的处理消息期间出现错误/异常 2)Spring无法找到合适的ArgumentResolver来将收益消息从SQS转换为您的bean。我发现你正在使用你的自定义bean - &#39;消息&#39;

您可以查看documentation,第5.2.5节

答案 1 :(得分:0)

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

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

第二,我无法让@SqsListener与非String参数一起使用,除非它位于以@Controller注释的类中。对于非控制器类,我必须添加第二个方法参数(@Header("SenderId") String senderId对我有用),然后正确路由