java - 异步@RabbitListener中的同步代码?

标签 java spring asynchronous rabbitmq amqp

从 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/

相关文章:

java - 如何将 Firebase 中的数据检索到 Android Studio

java - 我们如何在 Java 中关闭 hsqldb 数据库

java - Spring,Tomcat 试图在 server.xml 中设置上下文 URL 路径,但它不起作用

asynchronous - 克隆字符串以在Rust中进行异步移动关闭

multithreading - 用于异步 Web 服务的 Java ExecutorService

asp.net - 从 asp.net 核心 Controller 方法返回结果后如何继续处理?

java - 连接到 Microsoft SQL Server 2005 中的数据库引擎

java - 日历。HOUR_OF_DAY 困惑

java - 如何更改 Java 中 Date 对象的时区偏移量?

java - 如何使用 REST 和 JPA/Hibernate 正确更新实体