使用Spring Cloud监听AWS SQS队列的方法如下:
@SqsListener(value = "${queue.name}", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
public void queueListener(String message, @Headers Map<String, Object> sqsHeaders) {
// code
}
Spring配置:
<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);
}
这个很好用。
如上面的代码所示,将10个线程配置为处理SQS客户端中的这些消息。这也很好用,任何时候最多处理10条消息。
问题是,我找不到控制轮询间隔的方法。默认情况下,Spring在所有线程都空闲时才进行一次轮询。
例如:
- 约有3条消息被传递到队列
- Spring轮询队列并获取3条消息
- 正在处理3条消息,每条消息大约需要20分钟
与此同时,约有25条消息传递到队列中。直到早期传递的3条消息全部完成后,Spring才不会轮询队列。如上面的例子所示,即使有7个线程空闲,Spring也要等待20分钟才开始轮询!
您有什么想法可以控制此轮询?即:如果有任何线程空闲,则应该开始轮询,并且不应等待所有线程都变为空闲状态。