将 SqsListener 配置为长池

pla*_*oom 5 java spring amazon-sqs spring-cloud

我正在使用 spring boot 实现 SQS 订阅者,经过在互联网上的一些研究,我找到了该项目spring-cloud

使用注释@SqsListener看起来很容易从主题接收消息,但我想将其实现为长池,而不是短池,后者在每条消息到达时都会接收消息。

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

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

GSS*_*ain 7

使用 AWS Java SDK 1.X。

您需要定义一个org.springframework.cloud.aws.messaging.config.SimpleMessageListenerContainerFactory需要com.amazonaws.services.sqs.AmazonSQSAsyncbean 的自定义 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());
}
Run Code Online (Sandbox Code Playgroud)

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