【问题标题】:Configure SqsListener as Long Pooling将 Sqs 侦听器配置为长轮询
【发布时间】:2021-08-09 05:55:45
【问题描述】:

我正在使用 Spring Boot 实现一个 SQS 订阅者,在互联网上进行了一些研究后,我发现了该项目 spring-cloud

使用注解@SqsListener 看起来很容易接收来自主题的消息,但我想将其实现为长池而不是短池,以便在消息到达时立即接收。

    @SqsListener(
        value = ["queue"],
        deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS
    )
    fun subscribeToSSmsg: String) {
    ....
    }

这工作顺利,但我想使用长池接收消息。有没有办法使用 spring-cloud 来做到这一点?

【问题讨论】:

    标签: java spring spring-cloud amazon-sqs


    【解决方案1】:

    使用 AWS Java SDK 1.X。

    您需要定义一个自定义 org.springframework.cloud.aws.messaging.config.SimpleMessageListenerContainerFactory bean,它需要一个 com.amazonaws.services.sqs.AmazonSQSAsync bean。

    将以下 bean 添加到您的配置中。

    @Bean
    public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory(AmazonSQSAsync amazonSqs) {
        SimpleMessageListenerContainerFactory factory = new SimpleMessageListenerContainerFactory();
        factory.setWaitTimeOut(20); //Long polling, the maximum value of 20 seconds
        factory.setAmazonSqs(amazonSqs);
        factory.setMaxNumberOfMessages(10); //The maximum number of messages you want to read in a single poll
        return factory;
    }
    
    @Bean
    @Primary
    AmazonSQSAsync amazonSQSAsync(AWSCredentialsProvider credentialsProvider) {
        return new AmazonSQSBufferedAsyncClient(
            AmazonSQSAsyncClientBuilder
                .standard()
                .withRegion("region") //Set an appropriate region
                .withCredentials(credentialsProvider)
                .build());
    }
    

    同时确保您使用的 HTTP 客户端的超时值高于您为长轮询设置的值。

    【讨论】:

    • 它是如何工作的?我的方法会收到消息列表吗?
    • 有一个轮询线程和多个工作线程(默认每个@SqsListener 注释数为2,您可以提供此)处理消息。每个工作线程一次将收到 1 条消息。如果您想深入了解SimpleMessageListenerContainer 的源代码。添加 SqsListener 注释并编写函数来处理单个消息的位置没有任何变化。轮询并将它们交给工作人员并最终删除成功消息的所有这些协调都由您负责。
    • 感谢您的解释,但我遗漏了一些东西。我正在使用 Localstack 运行本地测试,当我在队列上发布一条消息时,我的函数 subscribeToSSmsg() 会自动调用 - 每条到达的消息都会调用它。我以为我将在 20 秒内收到 10 条消息——每 20 秒,我可以收到 10 条消息。我想念什么?
    • SQS 是一个基于拉取的消息传递系统,即您需要定期轮询。长轮询可帮助您减少轮询请求的数量。假设您在队列中没有任何消息,那么它将等待 20 秒等待单个轮询请求,然后再次开始轮询。如果您确实收到消息,那么轮询器将访问它。假设您的轮询应用程序关闭了一段时间,或者您收到大量消息并且您的队列有很多消息(例如超过 10 条),在这种情况下,您将在一个轮询请求中获得所有 10 条消息。跨度>
    • AmazonSQSBufferedAsyncClient 是否适用于 Fifo 队列?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2016-06-14
    • 2021-02-09
    相关资源
    最近更新 更多