RabbitMQ exchange使用-广播模式(Publish Subscribe)

本文介绍了RabbitMQ中广播模式的工作原理,通过创建fanout类型的exchange,消息会被发布到所有与其绑定的队列。示例展示了如何编写生产者和两个消费者程序,演示了广播模式下消息的发送与接收过程。

RabbitMQ exchange使用-广播模式(Publish Subscribe)

1 简介

广播模式,将消息发布到交换器上,所有和这个交换器绑定的队列都可以接收到。

如果此刻没有绑定队列就是丢弃了。

这个和微信公众号的订阅差不多

交换机类型 fanout(不处理路由键)

 

 

 

2 代码

2.1 生产者

package com.yzcq.rabbitmq.publishsubscribe;

 

import com.rabbitmq.client.Channel;

import com.rabbitmq.client.Connection;

import com.rabbitmq.client.ConnectionFactory;

import com.rabbitmq.client.MessageProperties;

import com.yzcq.rabbitmq.util.ConnectionUtil;

import java.io.IOException;

import java.util.concurrent.TimeoutException;

 

/**

 * 发布和订阅模式-生产者

 */

public class Send {

 

    private static final String EXCHANGE_NAME = "test-exchange_name";

 

    public static void main(String[] argv) throws IOException, TimeoutException {

 

        Connection connection = ConnectionUtil.getConnection();

        Channel channel = connection.createChannel();

        //声明一个交换机

        channel.exchangeDeclare(EXCHANGE_NAME, "fanout");

        //循环发消息发消息

        for (int i = 0; i < 50; i++) {

            String message = "我是发送者 订阅发布者【"+i+"";

            //广播模式,将消息发布到交换器上,所有和这个交换器绑定的队列都可以接收到。如果此刻没有绑定队列就是丢弃了。

            channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes());

            System.out.println(" 消息内容: " + message + "'");

            try {

                Thread.sleep(1000);

            }

            catch (InterruptedException e) {

                Thread.currentThread().interrupt();

            }

        }

 

        channel.close();

 

        connection.close();

    }

}

 

2.2 消费者1

package com.yzcq.rabbitmq.publishsubscribe;

 

import com.rabbitmq.client.AMQP.BasicProperties;

import com.rabbitmq.client.Channel;

import com.rabbitmq.client.Connection;

import com.rabbitmq.client.Consumer;

import com.rabbitmq.client.DefaultConsumer;

import com.rabbitmq.client.Envelope;

import com.yzcq.rabbitmq.util.ConnectionUtil;

import java.io.IOException;

 

/**

 * 发布和订阅模式-消费者1

 */

public class Receiver1 {

    private static final String EXCHANGE_NAME = "test-exchange-name";

 

    public static void main(String[] argv) throws Exception {

        Connection connection = ConnectionUtil.getConnection();

        Channel channel = connection.createChannel();

 

        //声明一个交换机

        channel.exchangeDeclare(EXCHANGE_NAME, "fanout");

        //获取一个临时队列

        String queueName = channel.queueDeclare().getQueue();

        //将队列绑定到交换机上

        channel.queueBind(queueName, EXCHANGE_NAME, "");

 

        System.out.println(" [1] 等待接受消息. 如果要退出按 CTRL+C");

 

        Consumer consumer = new DefaultConsumer(channel) {

            @Override

            public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body) throws IOException {

                String message = new String(body, "UTF-8");

                System.out.println(" [1] Received '" + message + "'");

                try {

                    Thread.sleep(2000);

                }

                catch (InterruptedException _ignored) {

                    Thread.currentThread().interrupt();

                }

 

            }

        };

        channel.basicConsume(queueName, true, consumer);

    }

}

 

2.3 消费者2

package com.yzcq.rabbitmq.publishsubscribe;

 

import com.rabbitmq.client.AMQP;

import com.rabbitmq.client.AMQP.BasicProperties;

import com.rabbitmq.client.Channel;

import com.rabbitmq.client.Connection;

import com.rabbitmq.client.ConnectionFactory;

import com.rabbitmq.client.Consumer;

import com.rabbitmq.client.DefaultConsumer;

import com.rabbitmq.client.Envelope;

import com.yzcq.rabbitmq.util.ConnectionUtil;

import java.io.IOException;

import java.util.concurrent.TimeoutException;

 

/**

 * 发布和订阅模式-消费者2

 */

public class Receiver2 {

    private static final String EXCHANGE_NAME = "test-exchange-name";

 

    public static void main(String[] argv) throws Exception {

        Connection connection = ConnectionUtil.getConnection();

        Channel channel = connection.createChannel();

 

        //声明一个交换机

        channel.exchangeDeclare(EXCHANGE_NAME, "fanout");

        //获取一个临时队列

        String queueName = channel.queueDeclare().getQueue();

        //将队列绑定到交换机上

        channel.queueBind(queueName, EXCHANGE_NAME, "");

 

        System.out.println(" [2] 等待接受消息. 如果要退出按 CTRL+C");

 

       Consumer consumer = new DefaultConsumer(channel) {

            @Override

            public void handleDelivery(String consumerTag, Envelope envelope,

                AMQP.BasicProperties properties, byte[] body) throws IOException {

                String message = new String(body, "UTF-8");

                System.out.println(" [2] Received '" + message + "'");

            }

        };

        channel.basicConsume(queueName, true, consumer);

    }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值