RabbitMQ学习交换机之direct模型

在这里插入图片描述
和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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值