我正在准备从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}
那么如果有任何线索会出错?
答案 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
对我有用),然后正确路由