摘要:事实上,消息发送者永远不会将消息直接发送到队列中,而是将消息发送到中,再由通过一定的路由规则路由到对应的消息队列中。
现在微服务盛行, 我们通常会进行解耦, 这时候就需要异步的消息队列来帮助各个服务之间解耦
rabbitmq的基本概念介绍rabbitmq的基本概念有消息producer(消息生产者)、exchange(交换机)、queue(队列)、consumer(消费者)、routingKey
(图中的P是producer, 即消息生产者, 中简的Server是Exchange(交换机) 和 Queue(队列))
Queue(队列)
queue是存放消息的队列, 实际上就是一个存放消息数据结构为队列的一个容器
exchange(交换机)
我们可能会简单的以为发送者会把消息发送到队列中, 然后消费者对队列进行监听。事实上, 消息发送者永远不会将消息直接发送到队列中, 而是将消息发送到exhang中, 再由exchange通过一定的路由规则路由到对应的消息队列中。
交换机有四种类型:
Direct Topic Headers Fanout Direct Exchange:
routingKey
在上面介绍exchange中说到消息通过一定的路由规则路由到对应的队列中, routingKey就是起着这样的一个作用,通常我们发送消息到exchane中的时候会携带一个routingKey, 而这个routingKey就是exchange和queue绑定的一个规则, 由此便可以将消息从exchange再发送到对应的queue上
参考文章https://segmentfault.com/a/11...
SpringBoot中使用rabbitmq首先添加以下依赖:
org.springframework.boot spring-boot-starter-amqp
配置项如下:
spring: rabbitmq: port: 5672 password: guest username: guest host: localhost listener: simple: acknowledge-mode: manual concurrency: 1 max-concurrency: 1 retry: enabled: true
在浏览器输入http://localhost:15672/, 在mq上我们新建了一个名为exchange1, routingKey为exhcange1-queue1的exchange, 并且映射到名为queue1的队列,
发送消息代码Prodcuer:
public class Sender{ @Autowired private RabbitTemplate rabbitTemplate; public void send(Object object) { CorrelationData correlationData = new CorrelationData(); correlationData.setId("exchange1-queue1-id"); String message = "hello world"; rabbitTemplate.convertAndSend("exchange1", "exchange1-queue1", "helloworld", new CorrelationData()); } }
在上面的代码中我们发送了一个消息到名为"exchange1", routingKey为"exchange1-queue1"的消息。我们启动rabbitmq。
发送后可以在mq上看到如下图已经成功发送了。
接下来贴上接受消息的receiver代码:
@Component public class Receiver { @RabbitListener(queues = "queue1") public void receive(Message message, Channel channel) { try { System.out.println(message.getBody()); } catch (Exception e) { e.printStackTrace(); } } }
接受消息后再看mq上如下图:
可以看出queue1上Ready一栏是0,但是Unacked一栏和Total一栏依然有消息, 这是因为我们再配置文件中设置的是手动的ack,这时候代码中没有进行ack, mq会认为消费者没有成功消费掉这条消息, 这时候就需要在配置文件中设置成自动ack, 或者在代码中手动进行ack,在消费者后添加如下代码:
channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/73258.html
摘要:进行插入操作的端称为队尾,进行删除操作的端称为对头。还有个专业术语要了解下生产者发送消息的应用程序被称为生产者。消费者接收消息的应用程序被称为消费者。参考链接下安装及操作常用命令译实战教程一你是否听说过或者使用过队列? 你是否听说过或者使用过消息队列? 你是否听说过或者使用过RabbitMQ? 提到这几个词,用过的人,也许觉得很简单,没用过的人,也许觉得很复杂,至少在我没使用消息队列之前,听...
摘要:安装步骤整体软件环境软件版本语言安装离线安装是使用这种编程语言开发的,所以安装的前提是安装语言。这次全都是离线安装,以便在远离的生产环境部署。 安装步骤 整体软件环境 |软件|版本||-|-||RHEL |7 update3||Erlong|19.3||rabbitMQ|3.6.10| Erlong语言安装离线安装 rabbitMQ是使用erlang这种编程语言开发的,所以安装rabb...
摘要:可以在地址看到如何使用讲解下上面命令行表示控制台端口号,可以在浏览器中通过控制台来执行的相关操作。同时从控制台可以看到发送的速率多线程测试性能开了个线程,每个线程发送条消息。 showImg(http://ww2.sinaimg.cn/large/006tNc79ly1g5jjb62t88j30u00gwdi2.jpg); 前提 上次写了篇文章,《SpringBoot Kafka 整合...
摘要:在发送后端监听声明的排他队列,当收到消息后比对正确则处理消息断开监听连接,然后此队列被系统自动回收。并且通过也看到了这条消息的返回。此时我们基本已经将问题锁定在端了。 背景 公司的一个项目使用rabbitmq作为broker进行交互,并且数据的查询方法使用RPC模式,RPC Client端使用java编写并使用springAMQP包与rabbitmq交互,在RPC Server端使用p...
阅读 2437·2021-09-01 10:41
阅读 1452·2019-08-30 14:12
阅读 521·2019-08-29 12:32
阅读 2868·2019-08-29 12:25
阅读 2944·2019-08-28 18:30
阅读 1715·2019-08-26 11:47
阅读 993·2019-08-26 10:35
阅读 2600·2019-08-23 18:06