异步@RabbitListener中的同步代码?

时间:2019-01-21 16:59:49

标签: java spring asynchronous rabbitmq amqp

从RabbitMQ文档中,使用@RabbitListener端点异步接收消息:

"The easiest way to receive a message asynchronously is to use the annotated listener endpoint infrastructure. In a nutshell, it allows you to expose a method of a managed bean as a Rabbit listener endpoint."

@RabbitListener(queues = "myQueue")
public void processOrder(String data) {
    ...
}

异步接收到底是什么意思?使用封锁呼叫有什么作用,例如给定processOrder(...)的定义,上面receiving asynchronously函数内部的同步HTTP?

1 个答案:

答案 0 :(得分:1)

在这里异步表示您不直接调用该方法,相反,某些后台服务会在您不受您控制的某个时间调用它。该方法将在哪个线程上调用,取决于该服务的配置。通常,此类服务使用线程池。

在异步方法中使用阻塞调用的结果是,该方法所运行的线程被阻塞,无法服务于其他异步调用。如果异步服务后面的线程池具有有限数量的线程,则可能会发生所谓的“线程饥饿”,并且无法处理新的异步调用。否则,如果线程池是无限的,则它可能会消耗所有可用内存,因为每个线程的调用堆栈需要0.5-1 MB。为了避免此类负面影响,必须以足够高的吞吐量来构建异步服务以承受预期的负载,并且在负载沉重的情况下,应采取预防措施,以使服务正常降级并且不会因OOM而使整个JVM崩溃。