模型
路由模式与发布订阅模式非常相似,但是路由模式增加了路由键的配置,生产者在发送消息到交换机的时候会指定一个routingKey,用于匹配队列,同时队列绑定到交换机时也会指定routingKey,交换机在向队列发送消息时,会根据routingKey来匹配。
生产者
public class Provider {
private static final String EXCHANGE_NAME="my_exchange";
private static final String ROUTE_KEY = "my_route";
public static void main(String[] args) throws Exception {
Connection conn = RabbitMqUtil.getConnection();
Channel channel = conn.createChannel();
//声明交换机,指明分发类型,路由模式
channel.exchangeDeclare(EXCHANGE_NAME, "direct");
//发送消息到交换机
channel.basicPublish(EXCHANGE_NAME, ROUTE_KEY, null, "exchange data route key。。。。".getBytes());
channel.close();
conn.close();
}
}
channel.exchangeDeclare(EXCHANGE_NAME, “direct”),声明交换机的时候direct说明使用路由模式,发送消息的时候指定routingKey。
消费者
public class Reciver2 {
private static final String EXCHANGE_NAME = "my_exchange";
private static final String QUNUE_NAME = "exchange_qunue2";
private static final String ROUTE_KEY = "my_route";
public static void main(String[] args) throws Exception {
Connection conn = RabbitMqUtil.getConnection();
Channel channel = conn.createChannel();
//声明队列
channel.queueDeclare(QUNUE_NAME,false,false,false,null);
//绑定队列到交换机
channel.queueBind(QUNUE_NAME, EXCHANGE_NAME, ROUTE_KEY);
//设置每次只发送一条消息
channel.basicQos(1);
Consumer consumer = new DefaultConsumer(channel) {
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException {
String msg = new String(body);
System.out.println(msg);
}
};
channel.basicConsume(QUNUE_NAME, true, consumer);
}
}
绑定到交换机的时候指明routingKey
从web页面可以看到申明的交换机是direct模式
同时绑定到交换机上的队列是否有routingKey