【问题标题】:Spring Integration + SQS - retry on exception doesn't workSpring Integration + SQS - 重试异常不起作用
【发布时间】:2019-08-25 23:13:17
【问题描述】:

我正在将 Spring Integration 与 AWS SQS 队列集成。

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

这是我的频道/适配器配置 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

请帮忙:)

【问题讨论】:

    标签: amazon-web-services spring-integration amazon-sqs spring-cloud-aws spring-integration-aws


    【解决方案1】:

    你的配置是这样的:

    @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;
    

    }

    inboundChannel 是这样的:

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

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

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

    或者您需要修改您希望如何处理该单独线程中的错误的逻辑,或者只是在 SqsMessageDrivenChannelAdapter 之后不使用 QueueChannel 并让它在底层 SQS 侦听器容器中抛出和处理错误这是@SqsListener的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      相关资源
      最近更新 更多