【发布时间】:2016-06-21 23:31:47
【问题描述】:
监听一个AWS SQS队列,使用spring cloud如下:
@SqsListener(value = "${queue.name}", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
public void queueListener(String message, @Headers Map<String, Object> sqsHeaders) {
// code
}
弹簧配置:
<aws-messaging:annotation-driven-queue-listener
max-number-of-messages="10" wait-time-out="20" visibility-timeout="3600"
amazon-sqs="awsSqsClient" />
AwsSqsClient:
@Bean
public com.amazonaws.services.sqs.AmazonSQSAsyncClient awsSqsClient() {
ExecutorService executorService = Executors.newFixedThreadPool(10);
return new AmazonSQSAsyncClient(new DefaultAWSCredentialsProviderChain(), executorService);
}
这很好用。
在 SQS 客户端中配置了 10 个线程来处理这些消息,如您在上面的代码中所见。这也可以正常工作,在任何时间点最多处理 10 条消息。
问题是,我想不出控制轮询间隔的方法。默认情况下,一旦所有线程都空闲,就会进行弹簧轮询。
即考虑下面的例子
- 大约 3 条消息被传递到队列
- Spring 轮询队列并获得 3 条消息
- 正在处理 3 条消息,每条消息大约需要 20 分钟
与此同时,大约有 25 条消息被传递到队列中。在之前传递的所有 3 条消息都完成之前,Spring 不会轮询队列。基本上按照上面的示例,Spring 仅在 20 分钟后进行民意调查,尽管仍有 7 个线程空闲!!
知道如何控制这个轮询吗?即,如果有任何线程空闲,则应该开始轮询,并且不应该等到所有线程都空闲
【问题讨论】:
-
您可以使用@SqsListener 吗?您是从源代码构建的吗?
-
我也面临同样的情况来控制轮询间隔。你找到解决办法了吗?
-
我们找不到任何选项,因此退出了春季并开始直接使用 AWS SDK 进行队列轮询。在根据可用线程数使用 AWS 开发工具包进行轮询时,我们会限制消息数
标签: amazon-web-services message-queue aws-sdk amazon-sqs spring-cloud