spring-cloud - How can I access to the acknowledge entity in spring cloud sqs without setting custom argument resolvers?
问题描述
In order to have access to events like S3EventNotification
we need to specify a custom argument resolver in in the QueueMessageHandlerFactory
. But since the order in which those argument resolver are evaluated matters it forces me to have a list that has every argument resolver twice. Is it possible to avoid this?
I am trying to read from a queue where events are generated by amazon itself. In this case I need to set
messageConverter.setStrictContentTypeMatch(false);
as explained here: https://cloud.spring.io/spring-cloud-aws/1.2.x/multi/multi__messaging.html#_consuming_aws_event_messages_with_amazon_sqs In the method however I needed to use Acknowledge, Visibility, and header method parameters but those were not passed correctly unless I redefine all the possible argument resolver in the configuration.
So to have the following method signature:
@SqsListener(value = "${my-queue-name}", deletionPolicy = NEVER)
public void processRequest(
@Payload S3EventNotification s3EventNotificationRecord,
@Header("ApproximateReceiveCount") final int receiveCount,
Acknowledgment acknowledgment,
Visibility visibility) {
// do some stuff and decide to acknowledge or extend visibility
}
I was forced to write this custom configuration like:
@Configuration
public class AmazonSQSConfig {
private static final String ACKNOWLEDGMENT = "Acknowledgment";
private static final String VISIBILITY = "Visibility";
@Bean
public QueueMessageHandlerFactory queueMessageHandlerFactory() {
QueueMessageHandlerFactory factory = new QueueMessageHandlerFactory();
factory.setArgumentResolvers(initArgumentResolvers());
return factory;
}
private List<HandlerMethodArgumentResolver> initArgumentResolvers() {
MappingJackson2MessageConverter messageConverter = new MappingJackson2MessageConverter();
messageConverter.setStrictContentTypeMatch(false);
return List.of(
new HeaderMethodArgumentResolver(null, null),
new HeadersMethodArgumentResolver(),
new NotificationSubjectArgumentResolver(),
new AcknowledgmentHandlerMethodArgumentResolver(ACKNOWLEDGMENT),
new VisibilityHandlerMethodArgumentResolver(VISIBILITY),
new PayloadArgumentResolver(messageConverter));
}
}
I would expect to have a way to define a custom argument resolver but still have all the argument passed to the method once executed.
解决方案
推荐阅读
- optimization - 获取一组行的最优化方法是什么,这些行出现在 java 8 的列表中间?
- ssas - SSAS,如何使维度属性月仅显示当年的月份?
- android - TTS 工作一分钟后停止说话
- java-8 - 转换 Flux 时卡住了
到单声道 ? - javascript - 百万行表(Web 开发)
- beautifulsoup -
使用 beautifulsoup 从 html 解析数据中提取记录 - create-react-app - 卸载 Expo CLI
- arrays - 无法在 Swift 4.2 中将类型“[UITableViewCell.Type]”的值转换为“[_.Type]”
- django - 搜索鹡鸰图像
- java - Java中的字符串数组赋值