Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services Spring cloud SQS-轮询间隔_Amazon Web Services_Message Queue_Aws Sdk_Amazon Sqs_Spring Cloud - Fatal编程技术网

Amazon web services Spring cloud SQS-轮询间隔

Amazon web services Spring cloud SQS-轮询间隔,amazon-web-services,message-queue,aws-sdk,amazon-sqs,spring-cloud,Amazon Web Services,Message Queue,Aws Sdk,Amazon Sqs,Spring Cloud,使用spring cloud侦听AWS SQS队列,如下所示: @SqsListener(value = "${queue.name}", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS) public void queueListener(String message, @Headers Map<String, Object> sqsHeaders) { // code } 这个很好用 配置了10个线程来处理SQS

使用spring cloud侦听AWS SQS队列,如下所示:

@SqsListener(value = "${queue.name}", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
public void queueListener(String message, @Headers Map<String, Object> sqsHeaders) {
    // code
}
这个很好用

配置了10个线程来处理SQS客户机中的这些消息,正如您可以看到上面的代码。这也很好,在任何时间点最多处理10条消息

问题是,我无法找到控制轮询间隔的方法。默认情况下,所有线程空闲后,spring将进行轮询

即考虑下面的例子

  • 大约有3条消息被传递到队列
  • Spring轮询队列并获得3条消息
  • 3条消息正在处理每条消息大约需要20分钟
  • 同时,大约有25条消息被传递到队列中。Spring不会轮询队列,直到之前传递的3条消息全部完成。本质上,根据上面的例子,Spring只在20分钟后进行投票,尽管还有7个线程可用


    你知道我们如何控制这次投票吗?i、 e.如果有任何线程可用,则应开始轮询,而不应等到所有线程都可用时才开始轮询。

    您的侦听器可以将消息加载到您的Spring应用程序中,并将其与
    确认
    可见性
    对象一起提交到另一个线程池(如果您想同时控制这两个对象)

    消息提交到此线程池后,侦听器可以加载更多数据。您可以通过调整线程池设置来控制并发性

    您的侦听器的方法签名类似于以下签名:

    @SqsListener(value = "${queueName}", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
    public void listen(YourCustomPOJO pojo,
                       @Headers Map<String, Object> headers,
                       Acknowledgment acknowledgment,
                       Visibility visibility) throws Exception {
    ...... Send pojo to worker thread and return
    

    确保设置的值大于最高处理时间(使用一些超时来限制执行时间)。

    您能使用@SqsListener吗?您是从源代码构建的吗?我也面临着控制轮询间隔的相同情况。您找到解决方案了吗?我们找不到任何选项,于是离开了spring,开始直接使用AWS SDK进行队列轮询。在根据可用线程数使用AWS SDK进行轮询时,我们限制了消息数
    @Bean
    public com.amazonaws.services.sqs.AmazonSQSAsyncClient awsSqsClient() {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        return new AmazonSQSAsyncClient(new DefaultAWSCredentialsProviderChain(), executorService);
    }
    
    @SqsListener(value = "${queueName}", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
    public void listen(YourCustomPOJO pojo,
                       @Headers Map<String, Object> headers,
                       Acknowledgment acknowledgment,
                       Visibility visibility) throws Exception {
    ...... Send pojo to worker thread and return
    
    acknowledgment.acknowledge().get();