?
Topic类型的Exchage与Direct相比,都是可以根据Routingkey把消息递交给不同的队列,只不过Topic类型的Exchage可以让队列在绑定Routingkey的时候使用通配符,这种模型的Routingkey一般都是又一个或多个单词组成,多个单词以“.”分割
通配符的介绍:
官网中这么说
解释一下:
如上图中的模型
*.orange.* 意思就是Routingkey要由三个单词组成,中间必须为orange 例:user.orage.save
*.*.rabbit 意思就是Routingkey要由三个单词组成,最后一个单词必须为rabbit 例:user.login.rabbit
lazy.# 意思就是Routingkey的开头的单词必须为lazy. 后面可以任意 例如: lazy.user lazy.user.test
?
代码实现:
1.创建生产者
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import utils.RabbitMQUtils;
/**
* 生产者
*/
public class Provider {
public static void main(String[] args) throws Exception {
//获取连接对象
Connection connection = RabbitMQUtils.getConnection();
//获取通道对象
Channel channel = connection.createChannel();
//通过通道声明交换机
channel.exchangeDeclare("topics","topic");
//发送消息
String routingkey = "user.save";
channel.basicPublish("topics",routingkey,null,("这是topic动态路由模型基于route key :["+routingkey+"]发送的消息 ").getBytes());
//关闭资源
RabbitMQUtils.closeConnectionAndChanel(channel,connection);
}
}
2.创建消费者
import com.rabbitmq.client.*;
import utils.RabbitMQUtils;
import java.io.IOException;
/**
* 消费者1
*/
public class Customer1 {
public static void main(String[] args) throws Exception {
//获取连接对象
Connection connection = RabbitMQUtils.getConnection();
//获取通道对象
Channel channel = connection.createChannel();
//通道声明交换机以及交换机的类型
channel.exchangeDeclare("topics","topic");
//创建一个临时队列
String queue = channel.queueDeclare().getQueue();
//基于route key 绑定队列和交换机 基于动态通配符的形式绑定
channel.queueBind(queue,"topics","user.*");
//获取消费的消息
channel.basicConsume(queue,true,new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("消费者1:"+new String(body));
}
});
}
}
3.运行消费者再运行消费者
发现消息被消费,因为Routingkey可以匹配多个规则,可以修改Routingkey多试试几种情况。
?
|