RabbitMq 路由模式(Routing)

RabbitMq 路由模式介绍

路由模式主要是在发布订阅模式的前提上增加了一个routingKey,这样就可以给队列绑定一个rotingKey发消息指定routingKey给指定的队列发送消息,这样就只有单独的消费者消费消息了

RabbitMq 路由模式(Routing)_第1张图片

DirectProducer编写

Routing模式主要是使用的direct交换机

public class DirectProducer {

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMqUtils.getChannel();
        Scanner scanner=new Scanner(System.in);
        while (scanner.hasNext()){
        	//发送消息,指定相关交换机,routingKey,持久化
            channel.basicPublish(CustomerFanoutExchangeOne.EXCHANGE_NAME,"info", MessageProperties.PERSISTENT_TEXT_PLAIN,(scanner.next()).getBytes());
            System.out.println("消息发送");
        }
    }
}

消费者One编写

public class CustomerDirectExchangeOne {

    public static final String EXCHANGE_NAME="logs";

    public static void main(String[] args) throws IOException, TimeoutException {
        Channel channel = RabbitMqUtils.getChannel();
        // 声明个交换机
        channel.exchangeDeclare(CustomerFanoutExchangeOne.EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
        //声明一个临时队列
        /**
         * 生成一个临时队列,队列名称是随机的
         * 当消费者断开与队列的链接的时候,队列就自动删除
         */
        String queue = channel.queueDeclare().getQueue();
        /**
         * 绑定交换机
         *
         */
        channel.queueBind(queue,EXCHANGE_NAME,"bug");

        System.out.println("消息的接收.......");
        // 消息消费成功的回调函数
        DeliverCallback deliverCallback = (String consumerTag, Delivery message) -> {
            System.out.println("消息消费: "+new String(message.getBody()));
			// 消息消费成功之后手动提交消费成功
			channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
        };
        // 消息消费失败的回调函数
        CancelCallback cancelCallback=(consumerTag)->{
            System.out.println("消息消费被中断");
        };
        // 消费消息
        channel.basicConsume(queue,true,deliverCallback,cancelCallback);
    }
}

消费者Two编写

public class CustomerFanoutExchangeTwo {

    public static void main(String[] args) throws IOException, TimeoutException {
        Channel channel = RabbitMqUtils.getChannel();
        // 声明交换机
        channel.exchangeDeclare(CustomerFanoutExchangeOne.EXCHANGE_NAME,"fanout");

        //声明一个临时队列
        /**
         * 生成一个临时队列,队列名称是随机的
         * 当消费者断开与队列的链接的时候,队列就自动删除
         */
        String queue = channel.queueDeclare().getQueue();
        /**
         * 绑定交换机
         *
         */
        channel.queueBind(queue, CustomerFanoutExchangeOne.EXCHANGE_NAME,"info");

        System.out.println("消息的接收.......");
        // 消息消费成功的回调函数
        DeliverCallback deliverCallback = (String consumerTag, Delivery message) -> {
            System.out.println("消息消费: "+new String(message.getBody()));
            // 消息消费成功之后手动提交消费成功
            channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
        };
        // 消息消费失败的回调函数
        CancelCallback cancelCallback=(consumerTag)->{
            System.out.println("消息消费被中断");
        };
        // 消费消息
        channel.basicConsume(queue,false,deliverCallback,cancelCallback);
    }

}

启动项目

发送消息时所绑定交换机的routingKey是info,所有应该只有绑定info的routingKey才能接收到消息,消息生产者发送消息AA BB

RabbitMq 路由模式(Routing)_第2张图片

routingKey不是info的未接收到消息

RabbitMq 路由模式(Routing)_第3张图片

routingKey是info的接收到了消息

RabbitMq 路由模式(Routing)_第4张图片

你可能感兴趣的:(rabbitMq,交换机,rabbitmq,java,队列)