如何在不设置自定义参数解析器的情况下访问Spring Cloud sqs中的确认实体?

时间:2019-05-28 16:48:26

标签: spring-cloud amazon-sqs

为了访问诸如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));
    }
}

我希望有一种定义自定义参数解析器的方法,但是一旦执行,仍然会将所有参数传递给方法。

0 个答案:

没有答案