RabbitMQ:Direct Exchange
一.相关概念
Exchange:接收消息,并根据路由键转发消息到所绑定的队列。
属性:
name:名称
type:交换机类型direct/topic/fanout/headers
durability:是否需要持久化
auto delete:当最后一个绑定到Exchange上的队列删除后,自动删除该Exchange
internal:当前Exchange是否用于RabbitMQ内部使用,默认为false
Arguments:扩展参数,用于扩展AMQP协议自制使用。
二.Direct Exchange
所有发送到Direct Exchange的消息会被转发到RoutingKey中指定的QUEUE.
注意:Direct模式使用RabbitMQ自带的Exchange:Default Exchange,所以不需要将Exchange进行任何绑定操作。队列名和routingkey必须完全匹配,消息才能被队列接收。
三.消费者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | public static void main(String[] args) throws IOException, TimeoutException, InterruptedException { //创建一个连接工厂 ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost( "192.168.10.132" ); connectionFactory.setPort( 5672 ); connectionFactory.setVirtualHost( "/" ); //创建连接 Connection connection = connectionFactory.newConnection(); //通过连接创建一个Channel Channel channel = connection.createChannel(); //创建一个队列 String exchangeName = "test_direct_exchange" ; String exchangeType = "direct" ; String queueName = "direct" ; String routingKey = "test.direct" ; String routingKey2 = "direct" ; //声明一个交换机 channel.exchangeDeclare(exchangeName,exchangeType, true , false , false , null ); //声明一个队列 channel.queueDeclare(queueName, false , false , false , null ); //建立绑定关系 channel.queueBind(queueName,exchangeName,routingKey); channel.queueBind(queueName,exchangeName,routingKey2); //创建一个消费者 QueueingConsumer consumer = new QueueingConsumer(channel); //设置Channel channel.basicConsume(queueName, true ,consumer); //获取消息 while ( true ){ QueueingConsumer.Delivery delivery = consumer.nextDelivery(); String msg = new String(delivery.getBody()); System.out.println( "消费端:" +msg); } } |
四.生产者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public static void main(String[] args) throws IOException, TimeoutException { //创建一个连接工厂 ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost( "192.168.10.132" ); connectionFactory.setPort( 5672 ); connectionFactory.setVirtualHost( "/" ); //创建连接 Connection connection = connectionFactory.newConnection(); //通过连接创建一个Channel Channel channel = connection.createChannel(); //通过Channel发送数据 channel.basicPublish( "test_direct_exchange" , "direct" , null , "test direct exchange" .getBytes()); //关闭连接 channel.close(); connection.close(); } |
关系拓扑:
生产者设置routingKey无论传direct或者传test.direct,都可以给消费者发送信息。但是设置其他的,消费者都无法接收消息。
标签:
RabbitMQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix