Java初识RabbitMQ一交换机(default exchange)
发布日期:2021-06-30 16:02:36 浏览次数:2 分类:技术文章

本文共 4363 字,大约阅读时间需要 14 分钟。

推荐:

Java初识RabbitMQ一交换机(default exchange)

首先看看AMQP协议,对RabbitMQ的架构会更了解。

创建一个Maven项目,根据自己服务器RabbitMQ的版本导入相应的包。

在这里插入图片描述

com.rabbitmq
amqp-client
3.6.5

默认交换机

默认交换机(default exchange)实际上是一个由消息代理预先声明好的没有名字(名字为空字符串)的直连交换机(direct exchange)。

它有一个特殊的属性使得它对于简单应用特别有用处:那就是每个新建队列(queue)都会自动绑定到默认交换机上,绑定的路由键(routing key)名称与队列名称相同。

举个栗子:当你声明了一个名为 “search-indexing-online” 的队列,AMQP 代理会自动将其绑定到默认交换机上,绑定(binding)的路由键名称也是为 “search-indexing-online”。因此,当携带着名为 “search-indexing-online” 的路由键的消息被发送到默认交换机的时候,此消息会被默认交换机路由至名为 “search-indexing-online” 的队列中。换句话说,默认交换机看起来貌似能够直接将消息投递给队列,尽管技术上并没有做相关的操作。

生产端

package com.kaven.rabbitmq.exchange.defaultExchange;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;import java.util.concurrent.TimeoutException;public class DefaultProducer {
// 自己服务器的IP private static String ip = "IP"; // RabbitMQ启动的默认端口,也是应用程序进行连接RabbitMQ的端口 private static int port = 5672; // RabbitMQ有一个 "/" 的虚拟主机 private static String virtualHost = "/"; // default exchange private static String exchange = ""; // default exchange 的路由规则: routingKey(test) 将匹配同名的 queue(test) private static String routingKey = "test"; public static void main(String[] args) throws IOException, TimeoutException {
// 1 创建一个连接工厂 ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost(ip); connectionFactory.setPort(port); connectionFactory.setVirtualHost(virtualHost); // 2 通过连接工厂创建连接 Connection connection = connectionFactory.newConnection(); // 3 通过连接创建一个Channel Channel channel = connection.createChannel(); // 4 通过Channel 发送数据 for (int i = 0; i < 5; i++) {
String msg = "Hello RabbitMQ:" + i; // 1 default的exchange ,2 routingKey channel.basicPublish(exchange,routingKey, null , msg.getBytes()); } // 5 关闭相关的连接 channel.close(); connection.close(); }}

消费端

package com.kaven.rabbitmq.exchange.defaultExchange;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;import com.rabbitmq.client.QueueingConsumer;import java.io.IOException;import java.util.concurrent.TimeoutException;public class DefaultConsumer {
// 自己服务器的IP private static String ip = "IP"; // RabbitMQ启动的默认端口,也是应用程序进行连接RabbitMQ的端口 private static int port = 5672; // RabbitMQ有一个 "/" 的虚拟主机 private static String virtualHost = "/"; // 定义的队列名 private static String queueName = "test"; // default exchange private static String exchange = ""; public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
// 1 创建一个连接工厂 ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost(ip); connectionFactory.setPort(port); connectionFactory.setVirtualHost(virtualHost); // 2 通过连接工厂创建连接 Connection connection = connectionFactory.newConnection(); // 3 通过连接创建一个Channel Channel channel = connection.createChannel(); // 4 声明(创建)一个队列 // 队列名、持久化、独占、自动删除、参数 channel.queueDeclare(queueName , true,false , false , null); // 5 创建消费者 QueueingConsumer queueingConsumer = new QueueingConsumer(channel); // 6 设置Channel // 队列名、自动回复ACK(收到消息后)、消费者 channel.basicConsume(queueName , true , queueingConsumer); // 7 获取消息 while(true){
QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery(); String msg = new String(delivery.getBody()); System.out.println("消费端:" + msg); } }}

测试一

先启动消费端。

看看RabbitMQ Management
有了一个新的ConnectionChannelQueueConsumer

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
队列的Name显然和我们定义的一样。
在这里插入图片描述
我们再来启动生产端。
消费端成功收到消息。

消费端:Hello RabbitMQ:0消费端:Hello RabbitMQ:1消费端:Hello RabbitMQ:2消费端:Hello RabbitMQ:3消费端:Hello RabbitMQ:4

RabbitMQ Management也会有反应,有显示相应的rate

在这里插入图片描述

测试二

先启动生产端。

RabbitMQ Management也会有反应,有相应的Ready=5等。
在这里插入图片描述
再启动消费端。
也成功收到了消息。

消费端:Hello RabbitMQ:0消费端:Hello RabbitMQ:1消费端:Hello RabbitMQ:2消费端:Hello RabbitMQ:3消费端:Hello RabbitMQ:4

RabbitMQ Management也会有反应,有相应的Ready=0,因为消费端已经全部收到了。

在这里插入图片描述
无论先启动生产端还是消费端,消费端都可以收到消息,所以说消费端成功收到消息跟两个应用是否同时在线无关,跟两个应用启动的先后顺序无关,不需要两个应用一直连接,耦合度低。

转载地址:https://kaven.blog.csdn.net/article/details/104242159 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java初识RabbitMQ一交换机(direct exchange)
下一篇:CentOS7.3 -bash: lsof: command not found

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月14日 02时03分24秒