Spring Integration + SQS-重试异常不起作用

时间:2019-04-04 08:59:41

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

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

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

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

答案 0 :(得分: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();
 }

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

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

或者您需要修改逻辑,以处理该单独线程中的错误,或者只是不要在QueueChannel之后使用SqsMessageDrivenChannelAdapter并让它抛出并处理底层的错误SQS侦听器容器,就@SqsListener而言。