Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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
Spring StreamListener任务执行器_Spring_Spring Cloud Stream_Spring Rabbit - Fatal编程技术网

Spring StreamListener任务执行器

Spring StreamListener任务执行器,spring,spring-cloud-stream,spring-rabbit,Spring,Spring Cloud Stream,Spring Rabbit,两个问题: 我有一个@StreamListener从RabbitMQ通道读取数据。我有一个包含500个ThreadTaskExecutor实例的池,用于在读取消息时对其进行处理 问题是@StreamListener正在读取消息,即使池已被完全利用 Caused by: org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor@4c15ce96 [Ru

两个问题:

我有一个@StreamListener从RabbitMQ通道读取数据。我有一个包含500个ThreadTaskExecutor实例的池,用于在读取消息时对其进行处理

问题是@StreamListener正在读取消息,即使池已被完全利用

Caused by: org.springframework.core.task.TaskRejectedException:
Executor [java.util.concurrent.ThreadPoolExecutor@4c15ce96
[Running, pool size = 500, active threads = 500, queued tasks = 1500,
completed tasks = 1025020]] did not accept task:
org.springframework.cloud.sleuth.instrument.async.SpanContinuingTraceCallable@4dc03919
是否有办法配置@StreamListener,使其仅在队列有容量时读取

此外,此错误会导致未声明的HrowableException。IO认为它试图将异常抛出回RabbitMQ,以便重新请求消息。然而,结局是这样的:

[WARN] o.s.a.r.l.ConditionalRejectingErrorHandler    
Execution of Rabbit message listener failed.  
org.springframework.amqp.rabbit.listener.exception
    .ListenerExecutionFailedException: 
Retry Policy Exhausted
最后的结果是我的信息丢失了

对第二个问题有什么建议吗?

您是否尝试为您的ThreadPoolTaskExecutor使用CallerRunPolicy?这样,任务不会以错误完成,SimpleMessageListenerContainer中的线程将忙于为刚到达的消息执行最新任务。如果不使用maxConcurrentConsumers选项,则不会引发新的并发侦听器,默认情况下,当前的concurrentConsumers=1将处于繁忙状态,并且不会从Rabbit MQ中提取新消息

请参阅中有关侦听器容器并发性的更多信息。这样,您甚至可以重新考虑自定义ThreadPoolTaskExecutor解决方案,并完全依赖框架中的内置机制


maxConcurrency选项也为公开。

除非您想冒丢失消息的风险,否则不应使用executor;消息将在切换后立即确认。正如@artem所说的,改用容器并发。我不完全理解答案,尽管它听起来像是我想要的解决方案。链接中的文档没有很好地解释并发模型。ListenerContainer for AMQP的问题已经是异步和多线程的。没有理由将消息转移到单独的线程池。您只需要在绑定器配置中为使用者增加maxConcurrency选项。