我有一个Web应用程序,其中我正在使用spring-amqp
来收听rabbitmq
中的消息,并通过以下设置启用了重试:
spring:
rabbitmq:
listener:
simple:
retry:
enabled: true
multiplier: 2
initial-interval: 15m
max-interval: 1h
org.springframework.retry.backoff.Sleeper
最常用的实现基于Thread.sleep
的位置- AFAIK -锁定当前线程?
我发现默认情况下并发amqp
侦听器计数为1,即使我将其更改为10,也是如此;线程池会长时间丢失线程。
使用spring-retry
长时间等待是否安全,就阻止来自侦听器线程池的线程处于长期状态而言?
这是一个逐个案例的问题,还是一种最佳做法是不使用长间隔来避免线程阻塞?
答案 0 :(得分:1)
这实际上取决于您的应用程序以及导致重试的原因。例如,如果数据库不可用,那么所有线程很可能都会重试。
但是,如果某些类型的消息可能会成功,而其他类型的消息则可能需要等待很长时间,那么也许您需要重新设计并针对这两种消息类型使用不同的队列/侦听器容器。
它并不会真的“伤害”任何东西,但我并不是很喜欢将消息长时间处于未经确认的状态。最好stop()
侦听器容器,直到解决下游问题为止。