SimpleMessageListenerContainer 亚马逊 SQS 轮询间隔

4

我正在使用Spring Cloud库轮询SQS。如何设置轮询间隔?

@Bean
@Primary
public AmazonSQSAsync amazonSQSAsync() {
    return AmazonSQSAsyncClientBuilder.standard().
            withCredentials(awsCredentialsProvider()).
            withClientConfiguration(clientConfiguration()).
            build();
}


@Bean
@ConfigurationProperties(prefix = "aws.queue")
public SimpleMessageListenerContainer simpleMessageListenerContainer(AmazonSQSAsync amazonSQSAsync) {
    SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer();
    simpleMessageListenerContainer.setAmazonSqs(amazonSQSAsync);
    simpleMessageListenerContainer.setMessageHandler(queueMessageHandler());
    simpleMessageListenerContainer.setMaxNumberOfMessages(10);
    simpleMessageListenerContainer.setTaskExecutor(threadPoolTaskExecutor());
    return simpleMessageListenerContainer;
}


@Bean
public QueueMessageHandler queueMessageHandler() {
    QueueMessageHandlerFactory queueMessageHandlerFactory = new QueueMessageHandlerFactory();
    queueMessageHandlerFactory.setAmazonSqs(amazonSQSAsync());
    QueueMessageHandler queueMessageHandler = queueMessageHandlerFactory.createQueueMessageHandler();
    return queueMessageHandler;
}


@Bean
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(10);
    executor.setMaxPoolSize(10);
    executor.setThreadNamePrefix("oaoQueueExecutor");
    executor.initialize();
    return executor;
}
1个回答

5
请在您的 queueMessageHandler() 函数中调用 org.springframework.cloud.aws.messaging.listener 包中 AbstractMessageListenerContainer 基类的 setWaitTimeOut(N) 方法。其中 N 是长轮询超时时间(以秒为单位)。 例如,如果您希望等待 5 秒钟才返回,请在函数中使用以下代码行。如果不调用此函数,则默认值为 1 秒。长轮询超时的最大值为 20 秒,因此您可以将此函数的最大值设置为 20,表示“等待 20 秒”。
simpleMessageListenerContainer.setWaitTimeOut (5);

源代码在这里:https://github.com/spring-cloud/spring-cloud-aws/blob/master/spring-cloud-aws-messaging/src/main/java/org/springframework/cloud/aws/messaging/listener/AbstractMessageListenerContainer.java

意思是该网页提供了源代码的下载链接,可以点击链接获取源代码。
/**
     * Configures the wait timeout that the poll request will wait for new message to arrive if the are currently no
     * messages on the queue. Higher values will reduce poll request to the system significantly.
     *
     * @param waitTimeOut
     *         - the wait time out in seconds
     */
    public void setWaitTimeOut(Integer waitTimeOut) {
        this.waitTimeOut = waitTimeOut;
    }

1
谢谢@Raj。这个和在AWS控制台中设置为SQS配置的长轮询间隔有什么区别? - Punter Vicky
1
好问题。帮助文档上说:“长轮询接收调用在返回空响应之前等待消息变得可用的最长时间。”我的理解是,如果您在控制台中将最大值设置为15秒,则可以在Java客户端中选择1到15之间的值。 - Raj
1
谢谢,我会测试一下。 - Punter Vicky
根据AWS文档,轮询请求中的正值优先于队列属性: 对于ReceiveMessage操作的WaitTimeSeconds参数,设置在1到20之间的值优先于为队列属性ReceiveMessageWaitTimeSeconds设置的任何值(请参见https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-long-polling.html)@PunterVicky - Andriy Kharchuk
1
@ Raj,您是建议扩展AbstractMessageListenerContainer吗?还是通过Spring应用程序上下文访问SimpleMessageListenerContainer并修改设置? - Andriy Kharchuk
请注意,从Spring Cloud 2.0.0版本开始,默认情况下超时时间设置为20秒。有关详细信息,请参见此问题:https://github.com/spring-cloud/spring-cloud-aws/issues/319。 - Andriy Kharchuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接