Routing之订阅模型-Topic
Topic类型的Exchange与Direc相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列再绑定RoutingKey的时候使用通配符!这种模型RoutingKey一般都是由一个或多个单词组成,多个单词之间以“.”分割,例如item.insert
其中,匹配不多不少恰好1个词,#匹配一个或多个词;比如:
audit .# 匹配audit.irs.corporate或者audit.irs
audit . 只能匹配audit.irs
Provider
public class Provider {
public static void main(String[] args) throws IOException {
//获取连接对象
Connection connection = RabbitMqUtils.getConnection();
Channel channel = connection.createChannel();
//声明交换机以及交换机类型 topic
String exchangeName = "topics";
channel.exchangeDeclare(exchangeName,"topic");
//发布消息
String routingKey = "user.save";
channel.basicPublish(exchangeName,routingKey,null,("这里是topic动态路由模型,routekey:["+routingKey+"]").getBytes());
//关闭资源
RabbitMqUtils.closeConnectionAndChannel(channel,connection);
}
}
Consumer1
public class Consumer1 {
public static void main(String[] args) throws IOException {
Connection connection = RabbitMqUtils.getConnection();
Channel channel = connection.createChannel();
String exchangeName = "topics";
//声明交换机以及交换机类型
channel.exchangeDeclare(exchangeName, "topic");
//创建临时队列
String queue = channel.queueDeclare().getQueue();
//绑定队列和交换机 动态统配符形式 route key
channel.queueBind(queue, exchangeName, "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));
}
});
//关闭连接
RabbitMqUtils.closeConnectionAndChannel(channel, connection);
}
}
Consumer2
public class Consumer2 {
public static void main(String[] args) throws IOException {
Connection connection = RabbitMqUtils.getConnection();
Channel channel = connection.createChannel();
String exchangeName = "topics";
//声明交换机以及交换机类型
channel.exchangeDeclare(exchangeName, "topic");
//创建临时队列
String queue = channel.queueDeclare().getQueue();
//绑定队列和交换机 动态统配符形式 route key
channel.queueBind(queue, exchangeName, "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("消费者2:" + new String(body));
}
});
//关闭连接
RabbitMqUtils.closeConnectionAndChannel(channel, connection);
}
}
片