首页 > 解决方案 > 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.

标签: spring-cloudamazon-sqs

解决方案


推荐阅读