当前位置: 首页 > 知识库问答 >
问题:

Spring集成SQS-异常重试不起作用

闻人昕
2023-03-14

我正在致力于将Spring集成与AWS SQS队列集成。

当我用ServiceActivator注释的方法引发异常时,我遇到了一个问题。在这种情况下,消息似乎无论如何都会从队列中删除。我已在SqsMessageDrivenChannelAdapter中将MessageDeletionPolicy配置为成功时的。

这是我的通道/适配器配置https://github.com/sdusza1/spring-integration-sqs/blob/master/src/main/java/com/example/demo/ChannelConfig.java

我也尝试过使用SqsListener注释进行同样的操作,消息并没有按预期删除。

我在这里创建了一个迷你Spring Boot应用程序来演示此问题:https://github.com/sdusza1/spring-integration-sqs

请帮忙:)

共有1个答案

冉高寒
2023-03-14

您的配置如下:

@Bean
public MessageProducerSupport sqsMessageDrivenChannelAdapter() {
    SqsMessageDrivenChannelAdapter adapter = new SqsMessageDrivenChannelAdapter(amazonSqs, SQS_QUEUE_NAME);
    adapter.setOutputChannel(inboundChannel());
    adapter.setMessageDeletionPolicy(SqsMessageDeletionPolicy.ON_SUCCESS);
    adapter.setVisibilityTimeout(RETRY_NOTIFICATION_AFTER);
    return adapter;

}

其中in边界通道是这样的:

 @Bean
    public QueueChannel inboundChannel() {
        return new QueueChannel();
 }

因此,这是一个队列,因此是异步的,来自该队列的消息由TaskScheduler在单独的线程上处理,TaskScheduler根据您的PollerMetadata配置轮询此类通道。在这种情况下,使用者中的任何错误也会被抛出到该线程中,并且不会到达SqsMessageDrivenChannelAdapter进行预期的错误处理。

从技术上讲,这与您的SqsListener体验完全不同,后者实际上是直接在容器线程上调用的,因此应用了它的错误处理。

或者,您需要修改您希望如何处理该单独线程中的错误的逻辑,或者只是不在SqsMessageDrivenChannelAdapter之后使用队列通道,让它在底层SQS侦听器容器中抛出和处理错误,就像在SqsListener中一样。

 类似资料:
  • 在spring boot中,我试图创建我的第一个事务性测试,但trasaction不起作用。 null 我需要的是: 将数据插入事务。 从事务中读取数据。 测试返回的数据。 回滚事务。

  • 结果只是显示无穷大,当我尝试除以0时,它不打印行。

  • 我正在使用带Spring security的Thymeleaf模板引擎。为了使用sec:authorize功能,我还使用了Thymeleaf-Spring Security集成模块,但由于某些原因,它不起作用。我没有收到任何错误,但是html div块中的所有代码都会被执行,无论用户扮演哪个角色。 例如,当我以员工身份登录时,我也会看到“去领导”和“去系统”按钮,但我不想让员工看到这些按钮。 这是

  • 我们使用的是Spring集成4.1.3。 使用tcp出站网关实现客户端。 请求期间从服务器收到一个tcp rset数据包,发生异常。什么原因?谢谢。 错误日志 wireshark日志在此处输入图像描述

  • 如果spring集成webflux流中发生异常,则异常本身(带有stacktrace)通过MessagePublishingErrorHandler作为有效负载发送回调用方,该处理器使用来自“errorChannel”头的错误通道,而不是默认错误通道。 如何设置类似于WebExceptionHandler的错误处理程序?我想生成一个Http状态代码,并可能生成一个DefaultErrorAttri