和fanout类型的区别就是,在进行交换机和队列绑定时的routingKey不再统一是"",指定routingKey进行绑定。同样在发送消息到交换机时也需要指定routingKey,不再是""。这样通过交换机与队列绑定时的routngKey和发送消息是指定的routingKey进行对应,交换机就知道该将消息发送到哪个队列。
生产者代码
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare("publish_subscribe_direct_exchange", BuiltinExchangeType.DIRECT,true,false,null);
channel.queueDeclare("publish_subscribe_direct_queue1",true,false,false,null);
channel.queueDeclare("publish_subscribe_direct_queue2",true,false,false,null);
//绑定是可为一个队列指定多个routingKey
channel.queueBind("publish_subscribe_direct_queue1","publish_subscribe_direct_exchange","info");
channel.queueBind("publish_subscribe_direct_queue1","publish_subscribe_direct_exchange","waring");
channel.queueBind("publish_subscribe_direct_queue2","publish_subscribe_direct_exchange","info");
String body1="来自publish_subscribe_direct_exchange的消息,routingKey为:info";
channel.basicPublish("publish_subscribe_direct_exchange","info",null,body1.getBytes());
String body2="来自publish_subscribe_direct_exchange的消息,routingKey为:waring";
channel.basicPublish("publish_subscribe_direct_exchange","waring",null,body2.getBytes());
消费者1代码
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
DefaultConsumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("publish_subscribe_direct_consumer1接收到消息->"+new String(body));
}
};
channel.basicConsume("publish_subscribe_direct_queue1",true,consumer);
消费者2代码
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
DefaultConsumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("publish_subscribe_direct_consumer2接收到消息->"+new String(body));
}
};
channel.basicConsume("publish_subscribe_direct_queue2",true,consumer);
与spring进行整合
生产者:xml文件
<rabbit:direct-exchange name="direct_exchange" id="direct_exchange">
<rabbit:bindings>
<rabbit:binding queue="spring_queue" key="info"/>
</rabbit:bindings>
</rabbit:direct-exchange>
<!--使用默认的direct类型交换机的队列,交换机名称为“”,默认routingKey为队列名-->
<rabbit:queue id="spring_queue" name="spring_queue" auto-declare="true"/>
发送消息指定routingKey
rabbitTemplate.convertAndSend("direct_exchange","info","消息内容");
消费者:通过重写MessageListener接口并将其放入spring,并配置其监听的队列
<rabbit:listener-container connection-factory="connectionFactory" acknowledge="manual" prefetch="2">
<!--通过队列名进行监听-->
<rabbit:listener ref="sping_mq_listener" queue-names="spring_queue"/>
</rabbit:listener-container>
实现的MessageListerner接口
@Component
public class Sping_mq_listener implements MessageListener {
public void onMessage(Message message) {
System.out.println("onMessage");
System.out.println(new String(message.getBody()));
}
}
总结
direct型交换机与队列进行绑定时需要指定routingKey,一个队列可以有多个routingKey