两个问题:
我从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
最终结果是我的信息丢失了。
对第二个问题的任何建议?
答案 0 :(得分:1)
您是否为CallerRunsPolicy
尝试了ThreadPoolTaskExecutor
?这样,任务就不会以错误结束,来自SimpleMessageListenerContainer
的线程将忙于为刚刚到达的消息执行最新任务。如果不使用maxConcurrentConsumers
选项,则不会引发新的并发侦听器,并且当前的一个(默认为concurrentConsumers = 1
)将忙,并且不会从Rabbit MQ中提取新消息。
在Docs中查看有关侦听器容器并发性的更多信息。这样,您甚至可以重新考虑自定义ThreadPoolTaskExecutor
解决方案,并完全依赖框架中的内置机制。
RabbitMQ Binder Consumer也公开了maxConcurrency
选项。