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
。 有了一个新的Connection
、Channel
、Queue
、Consumer
。 队列的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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年04月14日 02时03分24秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
查看生产环境日记常用的几个linux命令
2019-05-01
spring+quartz.2.3.0数据库持久化实现
2019-05-01
Malformed \uxxxx encoding.异常
2019-05-01
使用aspose.words 18.6实现pdf文档转换
2019-05-01
Java 生成文字图片
2019-05-01
com.itextpdf.text.exceptions.IllegalPdfSyntaxException: Unbalanced begin/end text operators.
2019-05-01
Java程序运行机制
2021-07-04
包机制介绍
2021-07-04
JavaDoc---生成自己的API文档
2021-07-04
Scanner对象的介绍
2021-07-04
Java三种流程结构介绍
2021-07-04
Java 方法(函数)详解
2021-07-04
Java数组详解
2021-07-04