我致力于将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
请帮助:)
答案 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
而言。