Routing之订阅模型-Topic
Topic类型的Exchange和Direct相比,都是可以根据RoutingKey把消息路由到不同列队
只不过Topic类型Exchange可以让列队再绑定RoutingKey的时候使用通配符!
这种模型RoutingKey一般都是由一个或多个单词组成,多个单词以“.”分割,例如:item.insert
生产者:
public class Provider { public static void main(String[] args) throws IOException { Connection connection = rabbitMQUtils.getConnection(); Channel channel = connection.createChannel(); channel.exchangeDeclare("topics","topic"); String routingkey="user.save.delete"; channel.basicPublish("topics",routingkey,null,("这里是topics动态路由模型,routingkey["+routingkey+"]").getBytes()); rabbitMQUtils.connectionAndchannelClose(connection,channel); } }
消费者1:
public class Customer1 { public static void main(String[] args) throws IOException { Connection connection = rabbitMQUtils.getConnection(); Channel channel = connection.createChannel(); channel.exchangeDeclare("topics","topic"); String queue = channel.queueDeclare().getQueue(); 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 { super.handleDelivery(consumerTag, envelope, properties, body); System.out.println("消费者-1"+new String(body)); } }); } }
消费者2:
public class Customer2 { public static void main(String[] args) throws IOException { Connection connection = rabbitMQUtils.getConnection(); Channel channel = connection.createChannel(); channel.exchangeDeclare("topics","topic"); String queue = channel.queueDeclare().getQueue(); 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 { super.handleDelivery(consumerTag, envelope, properties, body); System.out.println("消费者-2"+new String(body)); } }); } }