一、主题模式—>topic
主题模式与路由模式相似,但是,主题模式是一种模糊的匹配方式。交换机为topic模式,路由key可选 *(匹配明确的一个单词) 或 #(匹配0到多个单词).其路由的*和#类似于数据库中的模糊匹配。设置模糊的绑定方式,“*”操作符将“.”视为分隔符,匹配单个字符;“#”操作符没有分块的概念,它将任意“.”均视为关键字的匹配部分,能够匹配多个字符。 比如路由key为*.s.*只能接收com.s.com这样形式的队列消息,*是指有且只能有一个;#.s.#可以接收com.s.som、s.com、com.s、s、com.com.s.com.com等。
主题模式的生产者代码如下:
public class Producer {
public static void main(String[] args) throws IOException, TimeoutException {
//所有的中间件技术都是基于tcp/ip协议基础之上构建新的协议规范,只不过rabbitmq遵循的是amqp
//1.创建连接工程
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("ip");
connectionFactory.setPort(5672);
connectionFactory.setUsername("admin");
connectionFactory.setPassword("admin");
connectionFactory.setVirtualHost("/");
Connection connection = null;
Channel channel = null;
try {
//创建连接Connection
connection = connectionFactory.newConnection("生产者");
//通过连接获取通道Channel
channel = connection.createChannel();
//创建交换机
String exchangeName = "direct_msg_topic";
//设置交换机类型
String exchangeType = "topic";
//声明交换机 参数1:交换机名字 参数2:交换机类型 参数3:交换机是否持久化
channel.exchangeDeclare(exchangeName, exchangeType, true);
//声明队列名字
String queueName1 = "queue4";
String queueName2 = "queue5";
String queueName3 = "queue6";
/*
*创建队列
*参数1: 队列名称 如果队列不存在自动创建
*参数2: 用来定义队列特性是否要持久化 true 持久化队列 false 不持久化(服务重启后队列还保存,但不保存消息)
*参数3: exclusive 是否独占队列 true 独占队列 false 不独占
*参数4: autoDelete: 是否在消费完成后自动删除队列 true 自动删除 false 不自动删除
*参数5: 额外附加参数
*/
channel.queueDeclare(queueName1, true, false, false, null);
channel.queueDeclare(queueName2, true, false, false, null);
channel.queueDeclare(queueName3, true, false, false, null);
//绑定队列和交换机 参数1:队列名字 参数2:交换机名字 参数3:路由key
channel.queueBind(queueName1, exchangeName, "*.s.*");
channel.queueBind(queueName2, exchangeName, "#.s.#");
channel.queueBind(queueName3, exchangeName, "*.s");
Scanner sc = new Scanner(System.in);
//准备消息内容
String message ="hello,s2";
//发送消息给队列queue
channel.basicPublish(exchangeName, "com.s.rabbitmq", null, message.getBytes());
System.out.println("发送成功!");
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
} finally {
//7.关闭连接
// if (channel!=null&&channel.isOpen()){
// channel.close();
//