Как я могу получить доступ к объекту подтверждения в облачных средах Spring без настройки пользовательских преобразователей аргументов? - PullRequest
0 голосов
/ 28 мая 2019

Чтобы иметь доступ к таким событиям, как 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));
    }
}

Я ожидал, что у меня будет способопределите пользовательский преобразователь аргументов, но все же получите все аргументы, переданные методу после выполнения.

...