(内容来源于蚂蚁课堂)
topic模式实在路由key模式的基础上,使用了通配符来管理消费者接收消息。生产者P发送消息到交换机X,type=topic,交换机根据绑定队列的routing key的值进行通配符匹配;
符号#:匹配一个或者多个词lazy.# 可以匹配lazy.irs或者lazy.irs.cor
符号*:只能匹配一个词lazy.* 可以匹配lazy.irs或者lazy.cor
Topic生产者:
package com.google.util.topic;
import com.google.util.MQConnectionUtils;
import com.google.util.config.Config;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @author wk
* @Description:RabbitMQ 通配符模式(主题)
* @date 2019/12/10 11:45
**/
public class TopicProducer {
//交换机名称
private static String EXCHANGE_NAME = Config.TOPIC_EXCHANGE;
public static void main(String[] args) throws IOException, TimeoutException {
//建立连接
Connection connection = MQConnectionUtils.newConnection();
//创建通道
Channel channel = connection.createChannel();
//生产者绑定交换机 (交换机名称,交换机类型)
channel.exchangeDeclare(EXCHANGE_NAME, Config.exchangeType.topic);
String routingKey = "msg.info";
//String routingKey = "msg.info.email";
System.out.println("通配符模式-生产者启动!");
String msg = "[" + routingKey + "]RabbitMQ通配符模式的消息❤";
System.out.println(msg);
//发送消息
channel.basicPublish(EXCHANGE_NAME, routingKey, null, msg.getBytes());
//关闭通道和连接
channel.close();
connection.close();
}
}
Topic消费者:
package com.google.util.topic;
import com.google.util.config.Config;
import com.google.util.MQConnectionUtils;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @author wk
* @Description:通配符模式 邮件消费者
* @date 2019/12/10 14:21
**/
public class ConsumerEmailTopic {
public static final String EMAIL_QUEUE = "EMAIL_TOPIC_QUEUE";
private static String EXCHANGE_NAME = Config.TOPIC_EXCHANGE;
public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("通配符模式-邮件消费者启动!");
//建立连接
Connection connection = MQConnectionUtils.newConnection();
//创建通道
Channel channel = connection.createChannel();
//声明队列
channel.queueDeclare(EMAIL_QUEUE, false, false, false, null);
//消费者绑定交换机 (队列名称,交换机名称,routing)
channel.queueBind(EMAIL_QUEUE, EXCHANGE_NAME, "msg.#");
DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("通配符模式-邮件消费者获取生产者的消息:" + new String(body, "UTF-8"));
}
};
//自动应答
channel.basicConsume(EMAIL_QUEUE, true, consumer);
}
}
package com.google.util.topic;
import com.google.util.config.Config;
import com.google.util.MQConnectionUtils;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @author wk
* @Description: 消费者
* @date 2019/12/10 14:11
**/
public class ConsumerSmsTopic {
public static final String SMS_QUEUE = "SMS_TOPIC_QUEUE";
private static String EXCHANGE_NAME = Config.TOPIC_EXCHANGE;
public static void main(String[] args) throws IOException, TimeoutException {
System.out.println("通配符模式-短信消费者启动!");
//建立连接
Connection connection = MQConnectionUtils.newConnection();
//创建通道
Channel channel = connection.createChannel();
//声明队列 (参数2 durable持久的)
channel.queueDeclare(SMS_QUEUE, false, false, false, null);
//消费者队列绑定交换机
channel.queueBind(SMS_QUEUE, EXCHANGE_NAME, "msg.*");
//消费监听消息
DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("通配符模式-短信消费者获取生产者消息:" + msg);
}
};
//自动应答
channel.basicConsume(SMS_QUEUE, true, consumer);
}
}
启动生产者,消费者,可以看到短信邮件消费者都收到了信息。