You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot+SQS+LocalStack测试抛出异常,请求消除方法

2025-02-19T11:28:32.374+01:00 INFO 57865 --- [ecycle-thread-1] a.c.s.l.AbstractMessageListenerContainer : Container io.awspring.cloud.sqs.sqsListenerEndpointContainer#0 started
2025-02-19T11:28:32.380+01:00 INFO 57865 --- [ main] c.sample.samplesqslocalstack.ConsumerIT : Started ConsumerIT in 1.374 seconds (process running for 8.57)
2025-02-19T11:28:32.849+01:00 ERROR 57865 --- [nc-response-1-7] i.a.c.s.l.s.AbstractPollingMessageSource : Error polling for messages in queue my-queue.

java.util.concurrent.CompletionException: software.amazon.awssdk.core.exception.SdkClientException: Unable to execute HTTP request: Connection refused: /127.0.0.1:62508
at software.amazon.awssdk.utils.CompletableFutureUtils.errorAsCompletionException(CompletableFutureUtils.java:64) ~[utils-2.29.52.jar:na]
at software.amazon.awssdk.core.internal.http.pipeline.stages.AsyncExecutionFailureExceptionReportingStage.lambda$execute$0(AsyncExecutionFailureExceptionReportingStage.java:51) ~[sdk-core-2.29.52.jar:na]
at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) ~[na:na]
...
Caused by: java.net.ConnectException: Connection refused
at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
...

2025-02-19T11:28:33.617+01:00 ERROR 57865 --- [c-response-1-11] i.a.c.s.l.a.SqsAcknowledgementExecutor : Error acknowledging in queue my-queue messages bd279293-6f3e-4a15-b396-29fcdbeceef1 in 234ms
io.awspring.cloud.sqs.SqsAcknowledgementException: Error acknowledging messages bd279293-6f3e-4a15-b396-29fcdbeceef1
at io.awspring.cloud.sqs.listener.acknowledgement.SqsAcknowledgementExecutor.createAcknowledgementException(SqsAcknowledgementExecutor.java:88) ~[spring-cloud-aws-sqs-3.3.0.jar:3.3.0]
...
Caused by: java.net.ConnectException: Connection refused
at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
...

2025-02-19T11:28:33.668+01:00 INFO 57865 --- [ecycle-thread-3] a.c.s.l.AbstractMessageListenerContainer : Container io.awspring.cloud.sqs.sqsListenerEndpointContainer#0 stopped

---

## 解决方案

### 1. 调整关闭顺序:先停SQS监听器,再停LocalStack
测试结束时优先关闭Spring的SQS监听器容器,确保所有异步任务完成后再让LocalStack停止,修改测试类添加`@AfterAll`方法:
```java
@Autowired
private AbstractMessageListenerContainer<?> sqsListenerContainer;

@AfterAll
static void cleanup(@Autowired AbstractMessageListenerContainer<?> sqsListenerContainer) {
    // 停止SQS监听器,等待异步任务完成
    sqsListenerContainer.stop();
    // 预留时间确保监听器完全关闭
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}

2. 增加SQS监听器的关闭超时时间

在@DynamicPropertySource中配置关闭超时,给异步任务足够的完成时间:

@DynamicPropertySource
static void configure(DynamicPropertyRegistry registry) {
    // 原有配置...
    registry.add("spring.cloud.aws.sqs.listener.shutdown-timeout", () -> "5000"); // 设置5秒超时
}

3. 修改消息确认模式(可选)

将自动确认改为手动确认,在业务逻辑完成后立即确认消息,避免关闭时的异步确认操作:

@Service
@RequiredArgsConstructor
public static class Consumer {

    private final MyService myService;

    @SqsListener(queueNames = {"my-queue"}, acknowledgementMode = AcknowledgementMode.MANUAL)
    void listen(String message, Acknowledgement acknowledgement) {
        myService.doSomething(message);
        acknowledgement.acknowledge(); // 手动确认消息
    }
}

4. 测试后暂停轮询(可选)

测试完成后暂停监听器的轮询操作,避免后续无效的队列请求:

@AfterEach
void afterTest() {
    sqsListenerContainer.pause();
}

内容的提问来源于stack exchange,提问作者Sparkmuse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 07:47:00