java - RabbitMQ 中消息如何传递给消费者

标签 java rabbitmq

我目前正在开发一个使用 RabbitMQ 消息代理的应用程序。我对消息传递的工作原理感到困惑,我已经阅读了他们的官方文档,但无法澄清我的担忧。

假设我的应用程序可以从两个队列中获取消息,对于队列 A ,生产者直接将消息推送到该队列,而队列 B 通过交换器获取消息。我的问题是,如果队列A和队列B同时有消息发送给消费者,消费者将如何消费这些消息?顺序还是通过创建多个并行线程?.

如果我的主线程负责读取消息,那么让主线程进入休眠状态会停止消耗队列中的消息吗?我的意思是,只要主线程处于 sleep 状态,rabbitMQ 就会停止向消费者推送消息吗?我现在没有使用消费者确认,并试图看看是否可以通过使主线程进入 hibernate 状态一段所需的时间来停止消息消费。

最佳答案

RabbitMQ 消费者只能消费来自单个队列的消息。 RabbitMQ 消费者通过两种机制消费队列中的消息

  1. Push机制 - 在这种类型中,每当队列中有消息时,rabbitmq-server 就负责将消息推送给消费者。可以使用 basic_qos 配置来控制发送给消费者的消息数量。该消息可以自动确认,也可以由消费者确认。
  2. Pull机制 - 在这种类型中,消费者的工作是向rabbitmq-server请求消息。一次只能请求一条消息。

当消费者使用push机制连接时,消费者会运行一个IO循环,因此当您运行长时间运行的作业时,长时间运行的作业有可能会阻碍消费者心跳到rabbitmq服务器。处理此问题的一种方法是在单独的线程上运行长时间运行的作业。

关于java - RabbitMQ 中消息如何传递给消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62145295/

相关文章:

java - 通过 jt400 将文本文件写入 IFS 时出现问题

java - 以动态方式在 JScrollPane 上插入面板

c# - EasynetQ 总线。订阅未触发 - 抛出 "messageType must not be null"

docker - 如何在 Docker 中保留 RabbitMQ 用户帐户

android - Google Cloud Messaging 适用于发布/订阅位置系统

java - postgreSQL 会支持 rest API 吗?

java - 计算和编码线性代数(例如 Ax=B)的最短方法是什么

java - 如何使用 FileWriter 将文件写入 google dataproc?

python - 来自rabbitmq队列的base64 'payload'字符串无法正确解码

java - 如何在端口 8080 上启动 rabbitmq 服务器