StreamListener压倒性的TaskExecutor

时间:2018-03-27 15:59:41

标签: spring spring-cloud-stream spring-rabbitmq

两个问题:

我从RabbitMQ频道获得了@StreamListener个读数。我有一个由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,以便它只有队列才能读取?

此外,此错误最终会导致UndeclaredThrowableException。 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

最终结果是我的信息丢失了。

对第二个问题的任何建议?

1 个答案:

答案 0 :(得分:1)

您是否为CallerRunsPolicy尝试了ThreadPoolTaskExecutor?这样,任务就不会以错误结束,来自SimpleMessageListenerContainer的线程将忙于为刚刚到达的消息执行最新任务。如果不使用maxConcurrentConsumers选项,则不会引发新的并发侦听器,并且当前的一个(默认为concurrentConsumers = 1)将忙,并且不会从Rabbit MQ中提取新消息。

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

RabbitMQ Binder Consumer也公开了maxConcurrency选项。