Чтобы иметь доступ к таким событиям, как S3EventNotification
, нам нужно указать собственный преобразователь аргументов в QueueMessageHandlerFactory
.Но так как порядок, в котором оцениваются эти преобразователи аргументов, имеет значение, это заставляет меня иметь список, в котором каждый аргумент-преобразователь дважды.Можно ли этого избежать?
Я пытаюсь прочитать из очереди, в которой события генерируются самой Amazon.В этом случае мне нужно установить
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));
}
}
Я ожидал, что у меня будет способопределите пользовательский преобразователь аргументов, но все же получите все аргументы, переданные методу после выполнения.