为了访问诸如S3EventNotification
之类的事件,我们需要在QueueMessageHandlerFactory
中指定一个自定义参数解析器。但是,由于评估这些参数解析器的顺序很重要,因此它迫使我创建了一个包含每个参数解析器两次的列表。有可能避免这种情况吗?
我正在尝试从队列中读取数据,这些事件是由亚马逊本身生成的。 在这种情况下,我需要设置
messageConverter.setStrictContentTypeMatch(false);
,如此处所述:https://cloud.spring.io/spring-cloud-aws/1.2.x/multi/multi__messaging.html#_consuming_aws_event_messages_with_amazon_sqs 但是,在该方法中,我需要使用Acknowledge,Visibility和Header方法参数,但是除非我在配置中重新定义所有可能的参数解析器,否则这些参数将无法正确传递。
因此具有以下方法签名:
@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
}
我被迫编写如下这样的自定义配置:
@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));
}
}
我希望有一种定义自定义参数解析器的方法,但是一旦执行,仍然会将所有参数传递给方法。