从 RabbitMQ 文档中,使用 @RabbitListener
端点异步接收消息:
“异步接收消息的最简单方法是使用带注释的监听器端点基础结构。简而言之,它允许您将托管 Bean 的方法公开为 Rabbit 监听器端点。”
@RabbitListener(queues = "myQueue")
public void processOrder(String data) {
...
}
异步接收在这里到底意味着什么?使用阻塞调用有什么效果,例如考虑到异步接收
的定义,上面processOrder(...)
函数内部的同步HTTP?
最佳答案
异步意味着您不直接调用该方法,而是某些后台服务会在不受您控制的某个时刻调用它。将在哪个线程上调用此方法取决于该服务的配置。通常此类服务使用线程池。
在异步方法中使用阻塞调用的结果是该方法运行的线程被阻塞,并且无法为其他异步调用提供服务。如果异步服务背后的线程池的线程数量有限,则可能会发生所谓的“线程饥饿”,并且无法处理新的异步调用。否则,如果线程池不受限制,则它可能会消耗所有可用内存,因为每个线程的调用堆栈需要 0.5-1 MB。为了避免这种负面后果,异步服务的构建必须具有足够高的吞吐量以承受预期的负载,并且在负载过重的情况下,应采取预防措施以使服务优雅降级,而不是因 OOM 而导致整个 JVM 崩溃。
关于java - 异步@RabbitListener中的同步代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54294618/