RabbitMQ入门-Topic模式
发送到topic的消息不能有任意的绑定键,绑定键的规则:必须由(.)分割的单词列表。比如apple.banana.orange
绑定键也有两个特殊字符:
* 可以代替一个单词。
# 可以替代零个或多个单词。
比如:apple.# *.banana.*
生产者:
package com.example.demo; 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 TopicSend { private static final String EXCHANGE_NAME = "topic_logs"; public static void main(String[] args) throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); // 连接工厂 factory.setHost("localhost"); Connection connection = factory.newConnection(); // 获取连接 Channel channel = connection.createChannel(); // topic类型 channel.exchangeDeclare(EXCHANGE_NAME, "topic"); String[] msg = {"666的兔子","懒惰的大象"}; // 第二个参数为绑定键 channel.basicPublish(EXCHANGE_NAME, "quick.orange.rabbit", null, msg[0].getBytes()); channel.basicPublish(EXCHANGE_NAME, "lazy.write.elephant", null, msg[1].getBytes()); System.out.println("PS-Send:" + msg.toString()); channel.close(); connection.close(); } }
消费者:
package com.example.demo; import com.rabbitmq.client.*; import java.io.IOException; import java.util.concurrent.TimeoutException; public class TopicReceive { private static final String EXCHANGE_NAME = "topic_logs"; public static void main(String[] args) throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); // 连接工厂 factory.setHost("localhost"); Connection connection = factory.newConnection(); // 获取连接 Channel channel = connection.createChannel(); // 声明一个topic交换类型 channel.exchangeDeclare(EXCHANGE_NAME, "topic"); // 当声明队列,不加任何参数,产生的将是一个临时队列,getQueue返回的是队列名称 String queueA = channel.queueDeclare().getQueue(); String queueB = channel.queueDeclare().getQueue(); System.out.println("临时队列:" + queueA); System.out.println("临时队列:" + queueB); // 第三个参数为“绑定建” // * 可以代替一个单词。 // # 可以替代零个或多个单词。 channel.queueBind(queueA, EXCHANGE_NAME, "*.orange.*"); channel.queueBind(queueB, EXCHANGE_NAME, "*.*.rabbit"); channel.queueBind(queueB, EXCHANGE_NAME, "lazy.#"); Consumer consumerA = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String recv = new String(body, "UTF-8"); System.out.println("Direct-Receive-A:" + recv); } }; Consumer consumerB = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String recv = new String(body, "UTF-8"); System.out.println("Direct-Receive-B:" + recv); } }; channel.basicConsume(queueA, true, consumerA); channel.basicConsume(queueB, true, consumerB); } }
先启动消费者:再启动生产者:控制台
..
第一条消息,匹配A和B
第二条消息,只匹配B
小LUA
面对敌人的严刑逼供,我一个字也没说,而是一五一十写了下来。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· Tinyfox 简易教程-1:Hello World!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!