防止spring-cloud-aws-messaging尝试停止队列

14

我在一个Spring Boot项目中使用spring-cloud-aws-messaging

我已经在AWS中手动创建了SQS队列。

它被用于:

@SqsListener("${sqs.name.incoming}")
public void listen(String message) {
    ...
}

它的运行很正常。但是当我在IDE中停止我的应用程序,或者当Spring Boot测试完成时,它会尝试停止队列。它无法停止并最终超时。它抛出了这个异常:

2019-10-29 15:40:07.949  WARN 10378 --- [       Thread-2] s.c.a.m.l.SimpleMessageListenerContainer : An exception occurred while stopping queue 'my-awesome-queue-name'

java.util.concurrent.TimeoutException: null
    at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:204) ~[na:na]
    at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer.waitForRunningQueuesToStop(SimpleMessageListenerContainer.java:161) ~[spring-cloud-aws-messaging-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer.doStop(SimpleMessageListenerContainer.java:140) ~[spring-cloud-aws-messaging-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.cloud.aws.messaging.listener.AbstractMessageListenerContainer.stop(AbstractMessageListenerContainer.java:351) ~[spring-cloud-aws-messaging-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer.stop(SimpleMessageListenerContainer.java:45) ~[spring-cloud-aws-messaging-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.cloud.aws.messaging.listener.AbstractMessageListenerContainer.stop(AbstractMessageListenerContainer.java:239) ~[spring-cloud-aws-messaging-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer.stop(SimpleMessageListenerContainer.java:45) ~[spring-cloud-aws-messaging-2.1.3.RELEASE.jar:2.1.3.RELEASE]
    at org.springframework.context.support.DefaultLifecycleProcessor.doStop(DefaultLifecycleProcessor.java:238) ~[spring-context-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.context.support.DefaultLifecycleProcessor.access$300(DefaultLifecycleProcessor.java:53) ~[spring-context-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.stop(DefaultLifecycleProcessor.java:377) ~[spring-context-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.context.support.DefaultLifecycleProcessor.stopBeans(DefaultLifecycleProcessor.java:210) ~[spring-context-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.context.support.DefaultLifecycleProcessor.onClose(DefaultLifecycleProcessor.java:128) ~[spring-context-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1018) ~[spring-context-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext$1.run(AbstractApplicationContext.java:945) ~[spring-context-5.1.10.RELEASE.jar:5.1.10.RELEASE]

等待会导致应用程序或测试关闭变慢。

我该如何告诉 spring-cloud-aws-messaging 这是一个手动创建的队列,不应尝试关闭它?

1个回答

21

实际上并没有关闭SQS队列,而是关闭正在轮询队列的运行任务。默认超时时间为10秒,定义在SimpleMessageListenerContainer.queueStopTimeout中。

当任务轮询队列时,它会等待1到20秒钟的消息,这取决于SimpleMessageListenerContainerFactory.waitTimeOut的设置。如果此轮询时间大于10秒,则上述关闭将超时导致发生TimeoutException

因此,要解决此问题,可以将queueStopTimeout增加到大于20。

@PostConstruct
public void setUpListenerContainer() {
    listenerContainer.setQueueStopTimeout(25000);
}

或将投票waitTimeOut的时间缩短到小于10。

@Bean
public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory(AmazonSQSAsync amazonSqs) {
    SimpleMessageListenerContainerFactory factory = new SimpleMessageListenerContainerFactory();
    factory.setWaitTimeOut(5);
    return factory;
}

1
谢谢,问题已经在 https://github.com/spring-cloud/spring-cloud-aws/issues/504 得到了解答。不过还是接受你的回答,谢谢。 - Kartik
1
很好。我提出了一个问题,是否可以将默认值设置为>20以避免此异常。https://github.com/spring-cloud/spring-cloud-aws/issues/507 - Adrian M
谢谢,这正是我所需要的! - Felipe Desiderati
2
@AdrianM 你如何获取listenerContainer - Kurt Pattyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接